使一个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