如何防止sql注入?无需修改SQL查询

时间:2016-07-14 05:50:28

标签: php mysql database

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

$unsafe_variable = $_POST['user_input']; 

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

那是因为用户可以输入类似值'); DROP TABLE表; - ,查询变为:

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

可以采取哪些措施来防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

你需要做的绝对最小值是逃避变量:

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

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

整个mysql_query API已经被删除,它已经过时,最新版本的PHP不再支持它。你需要继续做更好的事情,我建议将PDO作为基准。

确保您正确行事的最佳方法是使用带有占位符值的预准备语句。那是你的查询看起来像这样:

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

使用PDO,您可以为占位符命名。这使得以后执行语句变得非常简单,只需匹配值:

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

因此,避免注射虫的最佳方法是首先避免注射。占位符值将被正确,安全,最重要,一致地替换。所有这一切都是一个错误,你认为你逃脱了一些事情,但你没有,人们可能会破坏你的网站。