web-dev-qa-db-fra.com

Faire une chaîne javascript SQL agréable

Y a-t-il moyen de créer une chaîne javascript vers NodeJS friendly pour MySQL? J'essaie de transmettre une adresse email à mon serveur NodeJS et de l'interroger dans la base de données MySQL. Lorsque vous utilisez du texte normal tel qu'un nom d'utilisateur, cela fonctionne bien, mais pas l'adresse électronique. Utiliser clairement escape n'est pas la bonne réponse car elle n'est pas destinée à l'insertion SQL. Je suppose que j'ai besoin de quelque chose sur les lignes de la fonction PHP mysql_real_escape_string()

41
Bobby

Il s'avère que mysql_real_escape_string () est assez triviale. Selon la documentation

mysql_real_escape_string () appelle la fonction de bibliothèque MySQL mysql_real_escape_string, qui ajoute des barres obliques inverses aux caractères suivants:\x00,\n,\r, \, ', "et\x1a.

Cela semble assez simple, en fait. Vous pouvez faire quelque chose comme ça:

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: je n'ai pas effectué de test unitaire ni de test de sécurité, mais cela semble fonctionner - et, en prime, il évite les onglets, les espaces arrière et '%'. il peut donc également être utilisé dans les requêtes LIKE, conformément à les recommandations de OWASP (contrairement à l'original PHP).

Je sais que mysql_real_escape_string() est sensible au jeu de caractères, mais je ne sais pas quel avantage cela ajoute.

Il y a une bonne discussion sur ces questions ici .

52
Paul d'Aoust

Dans le cas où quelqu'un cherche, escapeString () dans CUBRID RDBMS fonctionne comme suit:

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

Ceci est un extrait de CUBRID Node.js driver .

8
Eye

A appris à ses dépens que le fait de passer des nombres à cette fonction provoque la mort silencieuse du processus dans lequel il est utilisé Alors j'ajoute un petit test:

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

Utilisation de tableaux au lieu d'une instruction 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);
4
Justin

Pour tous ceux qui entendent cette réponse à partir de 2018, il convient également de noter qu'un certain nombre de cadres de base de données javascript contiennent désormais une méthode connection.escape. 

Par exemple: 

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

Si vous jouez avec des personnages CJK http://en.wikipedia.org/wiki/CJK_characters ou certaines icônes émotionnelles spéciales d'iOS/Android/autres mobiles ... tels que "‡ ‰ ™ © ??? ??? ? " ou decodeURIComponent ("\ xF3\xBE\xAD\xA0").

Vous devrez configurer votre my.cnf comme ceci

[client]
default-character-set = utf8mb4

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

Pourquoi ne pas simplement utiliser la fonction construite escapeLike ceci:

var escaped_str = escape(your_unescaped_string);

Cela fonctionne pour moi en utilisant MySQL sur le back-end.

0
wbartussek