Hacer una cadena de javascript sql amigable

¿Hay algo que hacer pasar una cadena de javascript a NodeJS friendly for MySQL? Estoy tratando de pasar una dirección de correo electrónico a mi server NodeJS y consultar en la database MySQL. Al hacer un text regular como un nombre de usuario funciona bien, pero la dirección de correo electrónico no. Usar el escape claramente no es la respuesta correcta, ya que no está destinado a la inserción de SQL. Supongo que necesito algo en la línea de la function PHP mysql_real_escape_string() .

Resulta que mysql_real_escape_string () es bastante trivial. De acuerdo con la documentation :

mysql_real_escape_string () llama a la function de biblioteca de MySQL mysql_real_escape_string, que antepone barras diagonales inversas a los siguientes caracteres: \ x00, \ n, \ r, \, ', "y \ x1a.

Suena bastante simple, en realidad. Podrías hacer algo como esto:

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

NOTA : No he ejecutado esto a través de ningún tipo de testing de unidad o testing de security, pero parece funcionar, y, como una ventaja adicional, se escapa de las tabs, los espacios posteriores y el '%', por lo que también se puede usar en consultas LIKE, según las recomendaciones de OWASP (a diferencia del original de PHP).

Sé que mysql_real_escape_string() tiene carácter-set-consciente, pero no estoy seguro de qué beneficio agrega.

Hay una buena discusión de estos temas aquí .

En caso de que alguien esté buscando, el escapeString () en CUBRID RDBMS funciona de la siguiente manera:

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

Este es un extracto del controller CUBRID Node.js.

Aprendí de la manera más difícil que pasar numbers a esta function hace que todo el process en el que se usa muera silenciosamente. Así que agrego una pequeña testing:

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

Usar matrices en lugar de una statement de caso:

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

Si juegas con personajes CJK http://en.wikipedia.org/wiki/CJK_characters o con algunos íconos emocionales especiales de iOS / Android / Otros mobilees … como " ‡ © © ™ © o decodeURIComponent (" \ xF3 \ xBE \ xAD \ xA0 ").

Deberá configurar su my.cnf como este

 [client] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 skip-character-set-client-handshake 
    Intereting Posts