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

时间:2011-11-02 15:37:20

标签: php mysql sql security sql-injection

以字符串格式给出1000个mysql查询,在运行查询之前,是否有办法分析并删除这些字符串中的任何SQL注入?

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

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

  

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

非常糟糕的主意。

解决方案是使用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()