55 votes

Rendre une chaîne javascript conviviale pour SQL

Existe-t-il un moyen de rendre une chaîne javascript transmise à NodeJS conviviale pour MySQL ? J'essaie de transmettre une adresse e-mail à mon serveur NodeJS et d'interroger la base de données MySQL. Lorsque vous faites du texte normal tel qu'un nom d'utilisateur, cela fonctionne bien, mais pas l'adresse e-mail. L'utilisation d'échappement n'est clairement 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() .

19voto

Simon H Points 512

J'ai appris à la dure que le fait de transmettre des nombres à cette fonction provoque la mort silencieuse de tout le processus dans lequel elle est utilisée. Alors je rajoute 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
        }
    });
}

12voto

sien Points 11

Pour tous ceux qui viennent à cette réponse à partir de 2018, il convient également de noter qu'un certain nombre de frameworks de bases 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 ); 

7voto

Justin Points 787

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

7voto

Eye Points 1329

Au cas où quelqu'un rechercherait, le 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 du pilote CUBRID Node.js.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X