如果插入用户输入而不修改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;--')
可以采取哪些措施来防止这种情况发生?
答案 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'));
因此,避免注射虫的最佳方法是首先避免注射。占位符值将被正确,安全,最重要,一致地替换。所有这一切都是一个错误,你认为你逃脱了一些事情,但你没有,人们可能会破坏你的网站。