给定1000个字符串格式的mysql查询,有没有办法在运行查询之前分析并删除这些字符串中的任何SQL注入?
我的一个想法是检查字符串中sql注入中使用的常见词/短语,这些常见词/短语在运行查询的应用程序中从未使用过。如果找到,请不要运行查询并提醒管理员。
发布于 2011-11-02 23:43:15
mySQL鼓励使用mysql_real_escape_string来清理查询。
避开unescaped_string中的特殊字符,并考虑到连接的当前字符集,以便可以安全地将其放在mysql_query()中。如果要插入二进制数据,则必须使用此函数。
mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,该函数将反斜杠添加到以下字符前面:\x00、\n、\r、\、‘、“和\x1a。
在向MySQL发送查询之前,必须始终(少数例外情况下)使用此函数来确保数据安全。
PS:这是对addslashes/mysql_real_escape_string争论的一个很好的回答:http://www.sitepoint.com/forums/showthread.php?337881-addslashes()-vs-mysql_real_escape_string()...the-final-debate&s=7cabb6e5fd909f2c787d47cd01471dfb&p=2439889&viewfull=1#post2439889
发布于 2011-11-03 00:34:35
我的一个想法是检查字符串中是否有在
注入中使用的常用词/短语,而这些常见词/短语在运行查询的应用程序中从未使用过。如果找到,请不要运行查询并提醒管理员。
非常糟糕的主意。
解决方案是使用PDO:http://php.net/manual/en/ref.pdo-mysql.php
并使用参数将所有 $vars传递给。
如果必须使用动态SQL,请确保根据白名单检查注入的内容。
关于如何安全地做到这一点,请参阅这个问题:How to prevent SQL injection with dynamic tablenames?
现在你被保存了。
如果不能使用PDO,可以使用mysql_real_escape_string()。
下面是一个例子:
$var = mysql_real_escape_string($_POST['unsafe_value']);
$query = "SELECT * FROM user WHERE username = '$var' ";
// The quotes are vital, without them ^ ^
//you will may get syntax errors and mysql_real.... will not protect you!您只能将其用于参数,而不能用于表、列、数据库名称或SQL构造,还要记住始终使用引号引用您的'$vars'。
对于值以外的任何内容,都必须使用白名单。
请注意,addslashes不起作用,不应该使用!
对于整数值,您可以使用intval(),但我建议您不要使用它,它不会节省时间,使您的代码更难阅读,而且它违反了总是使用mysql_real_escape_string()的规则。
https://stackoverflow.com/questions/7983070
复制相似问题