PHP SQL Sanitation VS准备好的语句

时间:2012-05-29 18:34:58

标签: php sql

快一点。

我正在将使用mysql的旧Web应用程序迁移到mysqli。我曾经使用我编写的自定义卫生功能防止SQL注入:

    function sani($text=""){
    if (!is_array($text)) { 
        $text = str_replace("<", "&lt;", $text); 
        $text = str_replace(">", "&gt;", $text); 
        $text = str_replace("\"", "&quot;", $text); 
        $text = str_replace("'", "&#039;", $text); 
        return $text; 
    } 
}

我以前使用它的方式:

mysql_query("SELECT * FROM `table` WHERE `username` = '" . $sani($userinput) . "'");

基本上它所做的就是更改可用于注入html编码的符号。到目前为止它已经运行良好,但由于我正在迁移到mysqli,我想知道准备好的语句是否比这个函数更安全。

另外,我已经阅读了很多关于准备和未准备的陈述之间的速度差异的内容,它真的那么引人注目吗?我每秒做一百个查询,所以我怀疑我会受到很大的影响吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

是的,准备好的语句肯定比这个功能更安全,而且它们还有一个额外的好处,就是当你从数据库中取回数据时也不需要解码数据。顺便说一句,即使对于旧的mysql库,你真的应该依赖mysql_real_escape_string而不是你定制的卫生功能:)

预备语句可以比未准备好的语句快得多,并且在典型的使用情况下,即使您“只是”执行100次查询/秒,您也将从中受益。

答案 1 :(得分:2)

预准备语句的安全性实际上源于在准备好的语句中查询数据是单独发送的。这就是为什么不可能执行1 st 类型的SQL注入(2 nd 类型(或间接)注入是在查询从数据连接时引起的注入在数据库中。)

您的“保护功能”的问题在于它并未涵盖所有情况。如果您想了解有关该问题的更多信息,可以阅读Slides From Recent Presentations on SQL Injection中的幻灯片或SQL injection: Not only AND 1=1上的幻灯片。

答案 2 :(得分:1)

不要那样做。

使用预准备语句保存数据,这样即使数据包含恶意代码,您也始终拥有数据库中的原始数据,没问题。事实上,你想要看看他们是如何试图破解你的东西。

当您输出不安全(用户提交的)数据以替换不需要的字符时,只需创建一个简单的过滤器,例如&lt; &GT;等