Делаем строку JavaScript дружественной к SQL - PullRequest
43 голосов
/ 12 октября 2011

Можно ли сделать так, чтобы строка JavaScript передавалась в NodeJS, дружественную для MySQL?Я пытаюсь передать адрес электронной почты на мой сервер NodeJS и выполнить запрос в базу данных MySQL.Когда обычный текст, такой как имя пользователя, работает нормально, а адрес электронной почты - нет.Использование escape явно не является правильным ответом, поскольку оно не предназначено для вставки SQL.Я предполагаю, что мне нужно что-то в строках PHP-функции mysql_real_escape_string().

Ответы [ 7 ]

53 голосов
/ 14 октября 2011

Оказывается, что mysql_real_escape_string () довольно тривиально. Согласно документации :

mysql_real_escape_string () вызывает библиотечную функцию MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \ x00, \ n, \r, \, ', "и \ x1a.

Звучит довольно просто, на самом деле. Вы можете сделать что-то вроде этого:

function mysql_real_escape_string (str) {
    return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
        switch (char) {
            case "\0":
                return "\\0";
            case "\x08":
                return "\\b";
            case "\x09":
                return "\\t";
            case "\x1a":
                return "\\z";
            case "\n":
                return "\\n";
            case "\r":
                return "\\r";
            case "\"":
            case "'":
            case "\\":
            case "%":
                return "\\"+char; // prepends a backslash to backslash, percent,
                                  // and double/single quotes
        }
    });
}

ПРИМЕЧАНИЕ :Я не проводил это ни через какие-либо юнит-тесты или тесты безопасности, но, похоже, он работает - и, в качестве дополнительного бонуса, он экранирует вкладки, пробелы и «%», поэтому его также можно использовать в LIKE.запросы в соответствии с рекомендациями OWASP (в отличие от оригинала PHP).

Я знаю, что mysql_real_escape_string() распознает набор символов, но я не уверен, какую пользу это дает.

Хорошее обсуждение этих вопросов здесь .

8 голосов
/ 26 сентября 2012

Если кто-то ищет, escapeString () в CUBRID RDBMS работает следующим образом:

var _escapeString = function (val) {
  val = val.replace(/[\0\n\r\b\t\\'"\x1a]/g, function (s) {
    switch (s) {
      case "\0":
        return "\\0";
      case "\n":
        return "\\n";
      case "\r":
        return "\\r";
      case "\b":
        return "\\b";
      case "\t":
        return "\\t";
      case "\x1a":
        return "\\Z";
      case "'":
        return "''";
      case '"':
        return '""';
      default:
        return "\\" + s;
    }
  });

  return val;
};

Это выдержка из CUBRID Node.js driver .

7 голосов
/ 18 сентября 2015

Трудно понять, что передача чисел в эту функцию приводит к тому, что весь процесс, в котором она используется, тихо умирает. Поэтому я добавляю небольшой тест:

function mysql_real_escape_string (str) {
    if (typeof str != 'string')
        return str;

    return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
        switch (char) {
            case "\0":
                return "\\0";
            case "\x08":
                return "\\b";
            case "\x09":
                return "\\t";
            case "\x1a":
                return "\\z";
            case "\n":
                return "\\n";
            case "\r":
                return "\\r";
            case "\"":
            case "'":
            case "\\":
            case "%":
                return "\\"+char; // prepends a backslash to backslash, percent,
                                  // and double/single quotes
        }
    });
}
4 голосов
/ 22 июля 2015

Использование массивов вместо оператора case:

var regex = new RegExp(/[\0\x08\x09\x1a\n\r"'\\\%]/g)
var escaper = function escaper(char){
    var m = ['\\0', '\\x08', '\\x09', '\\x1a', '\\n', '\\r', "'", '"', "\\", '\\\\', "%"];
    var r = ['\\\\0', '\\\\b', '\\\\t', '\\\\z', '\\\\n', '\\\\r', "''", '""', '\\\\', '\\\\\\\\', '\\%'];
    return r[m.indexOf(char)];
};

//Implementation
"Some Crazy String that Needs Escaping".replace(regex, escaper);
3 голосов
/ 28 марта 2018

Для тех, кто приходит к этому ответу начиная с 2018 года, также стоит отметить, что ряд структур баз данных javascript теперь содержат метод connection.escape.

Например:

var mysql = require('mysql')

var connection = mysql.createConnection( // your connection string here 

var query = "SELECT THING FROM THING WHERE FRED= " + connection.escape( your_string_here ); 
0 голосов
/ 31 августа 2018

Почему бы просто не использовать встроенную функцию escape Примерно так:

var escaped_str = escape(your_unescaped_string);

Это работает для меня, используя MySQL на сервере.

0 голосов
/ 11 мая 2013

Если вы играете с символами CJK http://en.wikipedia.org/wiki/CJK_characters или некоторыми специальными эмоциональными иконками iOS / Android / других мобильных телефонов ... таких как " ‡ ‰ ™ © ✨" или decodeURIComponent ("\ xF3 \ xBE \ XAD \ xA0" ).

Вам нужно будет настроить my.cnf следующим образом

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
skip-character-set-client-handshake
...