Задать вопрос

mysql_real_escape_string vs mysql_escape_string

Согласно документации, стоит использовать только функцию 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, "\\%");
};
  • Вопрос задан
  • 6081 просмотр
Подписаться 4 Оценить 1 комментарий
Ответ пользователя Виталий Желтяков К ответам на вопрос (5)
Здесь надо подходить со стороны — А используются ли запрещённые символы в проекте?

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