一种在一个函数中停止所有SQL注入的方法


A way to stop all SQL injection in one function?

给定1000个字符串格式的mysql查询,是否有一种方法可以在运行查询之前从这些字符串中分析和删除任何SQL注入?

我的一个想法是检查SQL注入中使用的常见单词/短语的字符串,这些单词/短语在运行查询的应用程序中从未使用过。

mySQL鼓励使用mysql_real_escape_string来清理查询。

转义unescaped_string中的特殊字符,取为对连接的当前字符集进行记帐,使其安全将其放在mysql_query()中。如果要插入二进制数据,则函数必须使用

mysql_real_escape_string()调用MySQL库函数Mysql_real_escape_string,在后面加上反斜杠字符:'x00, 'n, 'r, ', ', "和'x1a.

这个函数必须总是(除了少数例外)用来生成数据

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

我的一个想法是检查SQL注入中使用的常见单词/短语的字符串,这些单词/短语在运行查询的应用程序中从未使用过。如果找到了,不要运行查询并通知管理员。

非常糟糕的主意。

解决方案是使用PDO: http://php.net/manual/en/ref.pdo-mysql.php

并使用参数传递所有 $vars。
如果您必须使用动态SQL,请确保根据白名单检查注入的内容。
看看这个问题如何安全地做到这一点:如何防止SQL注入与动态表名?

现在你是保存。

如果不能使用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()的规则。