4

当用户的输入将被插入到 MySQL 查询中时,应该在用户输入中替换哪些危险字符?我知道引号、双引号、\r 和 \n。还有其他人吗?
(我没有使用接受参数的智能连接器的选项,因此我必须自己构建查询,这将在多种编程语言中实现,包括一些晦涩难懂的语言,因此mysql_real_escape_stringPHP 等解决方案无效)

4

2 回答 2

7

mysql.com 文档中的mysql_real_escape_string()

考虑到连接的当前字符集,将 from 中的字符串编码为转义的 SQL 字符串。结果被放入 to 并附加一个终止的空字节。编码的字符为 NUL (ASCII 0)、“\n”、“\r”、“\”、“'”、“"”和 Control-Z(参见第 8.1 节“文字值”)。(严格来说, MySQL 只要求对查询中用于引用字符串的反斜杠和引号字符进行转义。此函数引用其他字符以使它们更易于在日志文件中阅读。)


mysql_real_escape_string()是字符集感知的,因此复制它的所有功能(尤其是针对多字节攻击问题)并不是一件小事。

来自http://cognifty.com/blog.entry/id=6/addslashes_dont_call_it_a_comeback.html

AS = 添加斜杠()  
MRES = mysql_real_escape_string()
ACS = addcslashes() //用 "\\\000\n\r'\"\032%_" 调用

特征作为 MRES ACS
转义引号、双引号和反斜杠 是 是 是
转义 LIKE 修饰符:下划线、百分号 no no yes
用单引号而不是反斜杠转义 no yes*1 no
字符集感知 否 是*2 否
防止多字节攻击 否 是*3 否

于 2008-10-23T15:34:36.953 回答
4

您需要支持哪些语言?使用语言的内置清理比编写自己的要好得多。

编辑:在mysql_real_escape_stringphp.net 上查看:

mysql_real_escape_string()调用 MySQL 的库函数,该函数在以下字符前面加上mysql_real_escape_string反斜杠:\x00\n\r\'和."\x1a

于 2008-10-23T14:25:33.470 回答