Подтвердить что ты не робот

Создание javascript строки sql friendly

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

4b9b3361

Ответ 1

Оказывается, что 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
        }
    });
}

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

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

Здесь хорошо обсуждаются эти проблемы .

Ответ 2

В случае, если кто-то ищет, 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.

Ответ 3

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

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

Использование массивов вместо оператора 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);

Ответ 5

Если вы играете с символами 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