wake-up-neo.net

Ein Javascript String SQL freundlich

Gibt es einen JavaScript-String, der an NodeJS-friendly für MySQL übergeben wird? Ich versuche, eine E-Mail-Adresse an meinen NodeJS-Server zu übergeben und die MySQL-Datenbank abzufragen. Wenn Sie normalen Text wie einen Benutzernamen verwenden, funktioniert das einwandfrei, die E-Mail-Adresse jedoch nicht. Die Verwendung von Escape ist eindeutig nicht die richtige Antwort, da es nicht für das Einfügen von SQL gedacht ist. Ich gehe davon aus, dass ich etwas in der Zeile der PHP - Funktion mysql_real_escape_string() brauche. 

41
Bobby

Es stellt sich heraus, dass mysql_real_escape_string () ziemlich trivial ist. Laut Dokumentation

mysql_real_escape_string () ruft die MySQL-Bibliotheksfunktion mysql_real_escape_string auf, die den folgenden Zeichen Backslashes voranstellt:\x00,\n,\r, \, ', "und\x1a.

Klingt eigentlich ziemlich einfach. Sie könnten so etwas tun:

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
        }
    });
}

NOTE: Ich habe noch keinen Unit-Test oder Sicherheitstest durchlaufen, aber es scheint zu funktionieren - und als zusätzlicher Bonus entgeht er Tabs, Backspaces und '%'. Daher kann es auch in LIKE-Abfragen verwendet werden, gemäß den Empfehlungen von OWASP (im Gegensatz zum Original PHP).

Ich weiß, dass mysql_real_escape_string() auf Zeichensätze achtet, aber ich bin mir nicht sicher, welchen Vorteil das hat.

Es gibt eine gute Diskussion dieser Themen hier drüben .

52
Paul d'Aoust

Falls jemand sucht, funktioniert das escapeString () in CUBRID RDBMS wie folgt:

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;
};

Dies ist ein Auszug aus CUBRID Node.js driver .

8
Eye

Auf die harte Weise gelernt, dass das Weitergeben von Zahlen an diese Funktion dazu führt, dass der gesamte Prozess, in dem sie verwendet wird, leise stirbt. Ich füge also einen kleinen Test hinzu:

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
        }
    });
}
7
Simon H

Verwenden von Arrays anstelle einer case-Anweisung:

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);
4
Justin

Für alle, die ab 2018 zu dieser Antwort kommen, ist es auch erwähnenswert, dass eine Reihe von Javascript-Datenbank-Frameworks nun eine connection.escape-Methode enthalten. 

Zum Beispiel: 

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 ); 
2
sien

Wenn Sie mit CJK-Zeichen http://en.wikipedia.org/wiki/CJK_Zeichen oder mit speziellen emotionalen Symbolen für iOS/Android/Andere Handys spielen ... wie " ‡ ‰ ™ © ??? ? oder decodeURIComponent ("\ xF3\xBE\xAD\xA0").

Sie müssen Ihre my.cnf so einstellen

[client]
default-character-set = utf8mb4

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

Warum nicht einfach die eingebaute Funktion escape verwenden?

var escaped_str = escape(your_unescaped_string);

Dies funktioniert für mich mit MySQL im Backend.

0
wbartussek