0

我想保护我对数据库的所有输入。我写了跟随功能:

function mysql_real_escape_array($t){
    return array_map("mysql_real_escape_string",$t);
} 

在我编写的所有 php 数据加载的文件中:

$_POST=mysql_real_escape_array($_POST);

我认为我通过这个脏代码没有任何缺点,也没有恶意查询。或者有人认为,这段代码有什么缺点吗?

很高兴听到一些反馈。我知道这可能不是最好的解决方案,但这样我永远不会忘记逃避一些事情。

谢谢!

4

2 回答 2

2

通过PDOMySQLi使用准备好的语句。这是唯一真正安全且不会影响性能的方法。

于 2013-10-29T17:29:23.797 回答
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值也可以是数组,因此您的函数也需要是递归的。

忘记所有这些注意事项并使用带有或的参数化查询要容易得多。请注意,仅使用准备好的语句本身是不够的。您必须正确参数化查询。PDOmysqli

于 2013-10-29T17:31:42.713 回答