Fazendo uma cadeia de javascript sql amigável

Há algum tempo para fazer uma string javascript ser passada para o NodeJS amigável para o MySQL? Eu estou tentando passar um endereço de e-mail para o meu servidor NodeJS e consulta no database MySQL. Ao fazer um texto normal, como um nome de usuário, funciona bem, mas o endereço de e-mail não funciona. Usar escape claramente não é a resposta certa, pois não é para inserção de SQL. Estou assumindo que preciso de algo nas linhas da function PHP mysql_real_escape_string() .

Acontece que mysql_real_escape_string () é bem trivial. Segundo a documentação :

mysql_real_escape_string () chama a function mysql_real_escape_string da biblioteca do MySQL, que adiciona barras invertidas aos seguintes caracteres: \ x00, \ n, \ r, \, ‘, “e \ x1a.

Soa bem simples, na verdade. Você poderia fazer algo assim:

 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 : Eu não fiz isso através de qualquer teste de unidade ou teste de segurança, mas parece funcionar – e, como um bônus adicional, ele escapa de abas, backspaces e ‘%’, então ele também pode ser usado em LIKE queries, de acordo com as recomendações do OWASP (ao contrário do PHP original).

Eu sei que mysql_real_escape_string() é ciente do conjunto de caracteres, mas não tenho certeza qual o benefício que adiciona.

Há uma boa discussão dessas questões aqui .

Caso alguém esteja procurando, o escapeString () no CUBRID RDBMS funciona da seguinte maneira:

 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 é um trecho do driver CUBRID Node.js.

Aprendi da maneira mais difícil que passar números para essa function faz com que todo o processo em que ela é usada morra em silêncio. Então eu adiciono um pequeno teste:

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

Usando matrizes em vez de uma declaração 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); 

Para quem está vindo para esta resposta a partir de 2018, também é importante notar que um número de frameworks de database javascript agora contém um método connection.escape.

Por exemplo:

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

Se você estiver jogando com caracteres CJK http://en.wikipedia.org/wiki/CJK_characters ou alguns icons emocionais especiais de iOS / Android / Outros dispositivos móveis … como ” ‡ ‰ ™ © ✨” ou decodeURIComponent (“\ xF3 \ xBE \ xAD \ xA0 “).

Você precisará definir o seu my.cnf como este

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

Por que não simplesmente usar o escape function construída?

 var escaped_str = escape(your_unescaped_string); 

Isso funciona para mim usando o MySQL no back-end.