Сведения о вопросе

profi

09:32, 20th August, 2020

Теги

MySQL   JavaScript   Node.js    

mysql_real_escape_string vs mysql_escape_string

Просмотров: 343   Ответов: 5

Согласно документации, стоит использовать только функцию mysql_real_escape_string.
Насколько я понимаю, это связано в основном с применением юникода и действительно оправдано.

Вопрос: насколько часто ошибается mysql_escape_string и можно ли в языках с нативной поддержкой юникода пользовать своей реализацией вроде:
/**
 * Escape string for mysql. Don't use native function,
 * because it doesn't work without connect.
 */
exports.escapeStr = function(str) {
    return str.replace(/[\\"']/g, "\\$&").replace(/[\n]/g, "\\n")
                .replace(/[\r]/g, "\\r").replace(/\x00/g, "\\0");
};


UPD: Вышеприведённый код не полный, в нём присутствуют не все символы, которые нужно экранировать. Давайте будем исходить из того, что replace для \b, \t, \Z, _, % также присутствуют:
exports.escapeStr = function(str) {
    return str.replace(/[\\"']/g, "\\$&").replace(/\n/g, "\\n")
                .replace(/\r/g, "\\r").replace(/\x00/g, "\\0")
                .replace(/\b/g, "\\b").replace(/\t/g, "\\t")
                .replace(/\x32/g, "\\Z") // \Z == ASCII 26
                .replace(/_/g, "\\_").replace(/%/g, "\\%");
};



  Сведения об ответе

VCe znayu

12:14, 8th August, 2020

Я думаю Вы, ошибаетесь чаще чем те кто делали функцию mysql_real_escape_string. Я не хочу сказать что вы хуже программируете, а лишь то что:
1 — эта функция использует не только юникод, а текущую кодировку подключения.
2 — те кто писал эту функцию, возможно, наступили на не одни грабли, о которых Вам не известно
3 — этих четырех замен, возможно, будет не хватать для полноценного спокойствия
4 — она банально быстрей работает


  Сведения об ответе

ЯЯ__4

23:36, 3rd August, 2020

переходите наконец на bind параметры. кроме отсутствия вот таких проблем в плюс еще не будет повторного разбора запроса при каждом выполении.


  Сведения об ответе

lesha

05:40, 13th August, 2020

Здесь надо подходить со стороны — А используются ли запрещённые символы в проекте?

Лично у меня, для примера, в текущем проекте данные символы не используются, поэтому Я просто запретил их по белому списку, а от функции mysql_real_escape_string вообще отказался за ненадобностью.


  Сведения об ответе

DO__IT

00:00, 19th August, 2020

На stackoverflow ищем да? =)
goo.gl/LgdZi

Краткий пересказ: нельзя, ибо для экранирования нужна информация о кодировке подключения к базе.
Внизу, правда, дана якобы безопасная функция.


  Сведения об ответе

Chhiki

06:30, 19th August, 2020

Если latin1, то нафиг этот real_escape.

В быдло-коде на один скрипт обычно десяток-другой эскейпов. Ато и больше. И если использовать real_escape там, где он не нужен, то это будет 1 запрос к базе на 1 real_escape. На высоких нагрузках может встать на ручник.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться