使一个JavaScriptstringSQL友好

有没有做一个JavaScriptstring被传递给NodeJS友好的MySQL? 我试图将电子邮件地址传递给我的NodeJS服务器,并查询到MySQL数据库。 当做常规文本,如用户名工作正常,但电子邮件地址不。 显然使用转义不是正确的答案,因为它不适用于SQL插入。 我假设我需要PHP函数mysql_real_escape_string()

事实certificate,mysql_real_escape_string()是很平凡的。 根据文件 :

mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,它将反斜杠预置为以下字符:\ x00,\ n,\ r,\,',“和\ x1a。

听起来很简单,实际上。 你可以做这样的事情:

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

:我没有通过任何unit testing或安全testing运行,但它似乎工作 – 而且,作为一个额外的好处,它逃脱制表符,退格和'%',所以它也可以使用在LIKE查询中,按照OWASP的build议 (不像PHP原来的)。

我知道mysql_real_escape_string()是字符集意识,但我不知道什么好处增加。

这里有一个很好的讨论这些问题。

如果有人正在寻找, CUBRID RDBMS中的escapeString()的工作原理如下:

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

这是CUBRID Node.js驱动程序的摘录。

学会了通过这个函数传递数字的难题,使得它被使用的整个过程悄然死亡。 所以我添加一个小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 } }); } 

使用数组而不是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); 

如果您使用的是CJK字符http://en.wikipedia.org/wiki/CJK_characters或iOS / Android /其他手机的某些特殊情感图标,如“ ‰‰©©©”或decodeURIComponent(“\” XF3 \ XBE \ X-AD \ XA0" )。

你将需要像这样设置你的my.cnf

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