关于php:如何防止sql注入?

How to prevent sql Injection? without modification into an SQL query

本问题已经有最佳答案,请猛点这里访问。

如果在不修改SQL查询的情况下插入用户输入,则应用程序容易受到SQL注入的攻击,如下例所示:

1
2
3
$unsafe_variable = $_POST['user_input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");

这是因为用户可以输入类似于value');drop table table;--,查询变为:

1
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

如何才能防止这种情况发生?


您在这里需要做的绝对最小值是转义该变量:

1
$unsafe_variable = mysql_real_escape_string($_POST['user_input']);

此时,查询中的任何内容都不必更改。不过,这不一定是故事的结尾,因为mysql_real_escape_string并非无懈可击,您仍然会受到使用更复杂技术的人的注射攻击。

整个mysql_queryAPI都被破坏了,它已经过时了,最新版本的PHP不再支持它。你需要做些更好的事情,我建议把PDO作为基线。

确保正确执行的最佳方法是使用带有占位符值的已准备语句。您的查询如下所示:

1
INSERT INTO table name (column1) VALUES (:column1)

通过PDO,您可以命名占位符。这使得以后执行语句非常容易,只需匹配以下值:

1
$stmt->execute(array('column1' => $_POST['user_input'));

因此,避免注入错误的最佳方法是首先避免注入。占位符值将被正确、安全、最重要、一致地替换。只需要一个错误,你以为你逃脱了什么,但你没有,人们可以破坏你的网站全开。