php输入test / mysql_real_escape_string / pdo

时间:2014-11-14 10:48:31

标签: php mysql validation pdo

我正在处理一个需要通过表单将数据发送到数据库的应用程序。 我已经开发了一个输入测试类来获得干净的输入。 这是我的代码:

class test
{
    public static function inputTest($inputPar)
    {

        $con=mysqli_connect("localhost","****","*****","*******");

        // Check connection
        if (mysqli_connect_errno()) {
            return "Failed to connect to MySQL: " . mysqli_connect_error();
        }

        $text=htmlspecialchars($inputPar);
        $text0=trim($text);
        $text1=stripcslashes($text0);
        $text2= strip_tags($text1);
        $text3 = str_replace("’","'", $text2);
        $text4=mysql_real_escape_string($text3);
        mysqli_close($con);

        return $text4;
    }
}

当我尝试使用它时,一切都有效,除了最后$text4=mysql_real_escape_string($text3); 只是每次都给我发回一个空字符串。

我刚刚将所有应用程序转换为新的PDO驱动程序(不要介意这个类中的mysqli驱动程序,它只是一个让它工作的快速示例),并且我读到现在没有必要进行某些控制。所以我要问哪个控件对于具有良好的安全性仍然是强制性的。

Php版本是5.5.9。

1 个答案:

答案 0 :(得分:2)

您不能将ext / mysql函数与ext / mysqli连接一起使用。您必须使用其中一个进行连接和转义。

等效的PDO方法是PDO::quote(),但请注意,这会在字符串的每一端添加单引号,这与旧的mysql扩展的转义字符串函数不同。

所有这些都没有实际意义,因为如果您使用预准备语句并使用查询参数将变量添加到查询中,则无需清理输入。事实上,如果你将它们作为查询参数传递,你一定不能转义字符串,因为你会在你不想要它们的数据库中插入文字反斜杠。

在这里查看了很多很好的例子和讨论:How can I prevent SQL-injection in PHP?

您正在使用的所有其他“清理”功能也是不必要的,至少为了SQL注入防御的目的。这些功能不仅仅是“让它更安全”,具有累积效应。它们各自都有特定的用途,简单地将它们一起使用是天真的。

就像你有一个木工项目,你将水密,污渍,透明涂层和三种颜色的涂料涂在同一个表面上。他们每个人都很好,但是一起使用它们表明你不知道它们是什么。

您可能希望查看我的演示文稿SQL Injection Myths and Fallacies,或者观看我向旧金山MySQL用户组发送该演示文稿:https://www.youtube.com/watch?v=o4dJ7hdA8fs或我为Percona录制的免费网络研讨会:http://www.percona.com/webinars/2012-07-25-sql-injection-myths-and-fallacies < / p>