我希望保护我对数据库的所有输入。我写了以下函数:
function mysql_real_escape_array($t){
return array_map("mysql_real_escape_string",$t);
}
在我写的所有php数据加载的文件中:
$_POST=mysql_real_escape_array($_POST);
我认为通过这个脏代码我没有任何缺点,并且没有可能的恶意查询。或者有人认为,这个代码有什么缺点吗?
很高兴听到一些反馈。我知道这可能不是最好的解决方案,但通过这种方式我永远不会忘记逃避一些事情。
谢谢!
答案 0 :(得分:2)
通过Prepared Statements或PDO使用MySQLi。这是唯一真正安全且不会影响性能的方法。
答案 1 :(得分:2)
确保防止注入的唯一方法是使用正确的参数化查询。查询的所有参数都有漏洞,必须正确转义。这不仅是为了防止恶意注入,而是为了防止意外注入。例如,您可以:
SELECT value FROM t1
$value = $result; //$value is now "o'connel"
// SQL error caused by apostrophe in string
SELECT col FROM t2 WHERE value = '$value'
您可能认为此数据是安全的,因为它是内部数据,但仍然可能因未正确转义而导致问题。
关于覆盖$_POST
,请注意您仍然可以从$_POST
获取原始帖子正文以及$_REQUEST
值,因此无法确保您的数据已正确转义。更重要的是,mysql_real_escape_string
在您需要使用它时可能没有有效的mysql连接。这可能会导致问题和漏洞。 $_POST
值也可以是数组,因此您的函数也需要重复使用。
很多更容易忘记所有这些注意事项,并使用PDO
或mysqli
的参数化查询。请注意,使用预准备语句本身是不够的。您必须正确地参数化查询。