php输入测试/mysql\u real\u escape\u字符串/pdo

php输入测试/mysql\u real\u escape\u字符串/pdo,php,mysql,validation,pdo,Php,Mysql,Validation,Pdo,我正在开发一个应用程序,需要通过表单将一些数据发送到db。 我已经开发了一个输入测试类,用于获得干净的输入。 这是我的代码: class test { public static function inputTest($inputPar) { $con=mysqli_connect("localhost","****","*****","*******"); // Check connection if (mysqli_conn

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

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\u real\u escape\u字符串($text3),其他一切都正常
每次都会给我回一个空字符串

我刚刚将所有应用程序转换为新的PDO驱动程序(不要介意这个类中的mysqli驱动程序,这只是一个使其工作的快速示例),我了解到一些控制现在是不必要的。所以我要问的是,为了获得良好的安全性,哪种控制仍然是强制性的


Php版本是5.5.9。

不能将ext/mysql函数与ext/mysqli连接一起使用。连接和转义都必须使用一个或另一个

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

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

这里有很多好的例子和讨论:

您正在使用的所有其他“清理”功能也是不必要的,至少出于SQL注入防御的目的。这些功能并不是简单的“使其更安全”,而是累积效应。它们都有特定的用途,简单地将它们一起使用是幼稚的

这就像你有一个木工项目,你在同一个表面上涂上水封、染色、透明涂层和三种颜色的油漆。每一个单独使用都很好,但将它们全部使用表明您不知道它们的用途


您可能喜欢查看我的演示文稿,或者看我把演示文稿提交给旧金山MySQL用户组:或者我为PelCONA录制的免费网络研讨会:

记录每个变量并告诉我们输出。如果要使用PDO,则不需要mysql_real_escape_字符串。不,仅出于测试目的使用mysql_是不好的,因为坏习惯往往是建立在坏习惯上的。输入字符串是$input=“sjkaksdk”;输出为:text:sjkaksdk text0:sjkaksdk text1:sjkaksdk text2:sjkaksdk text3:sjkaksdk text4:(text4只是一个空字符串)我在PHP版本5.4.34上得到了相同的语句,在5.5.15“安全性”上一切正常。你在保护什么?非常感谢我会检查所有的链接,看看我的知识是否增加!