Php 从mysql real escape迁移到PDO以使其更加健壮?

Php 从mysql real escape迁移到PDO以使其更加健壮?,php,sql-injection,Php,Sql Injection,让我们看一个真实的例子;下一个代码是我目前正在使用的代码,在ver-ha-da问题中,但最近,由于索尼新闻等原因,我觉得我需要更多地了解“安全性”这个主题 这是我的代码,下面的函数是一个类的方法,但由于时间的原因,我不能向你们展示所有的东西 连接到我的数据库 调用查询的函数 然后是一个真正的简单用户身份验证示例: 所以基本上,我的$result是一个数组,它包含我需要的值(员工姓名、书名等等) 我的问题: 我不想在这里讨论MD5或使用salt,但考虑到这是我已经实现的代码,并且已经分布在50多个

让我们看一个真实的例子;下一个代码是我目前正在使用的代码,在ver-ha-da问题中,但最近,由于索尼新闻等原因,我觉得我需要更多地了解“安全性”这个主题

这是我的代码,下面的函数是一个类的方法,但由于时间的原因,我不能向你们展示所有的东西

连接到我的数据库 调用查询的函数 然后是一个真正的简单用户身份验证示例: 所以基本上,我的$result是一个数组,它包含我需要的值(员工姓名、书名等等)

我的问题: 我不想在这里讨论MD5或使用salt,但考虑到这是我已经实现的代码,并且已经分布在50多个文件中,有没有一种方法可以将我的代码转换为PDO方法


我必须说,我对PDO方法一无所知,我只是看到了一些示例,但它们太过理论化,没有足够的上下文…这里我有一个特定的上下文要解决…

PDO允许准备语句,所以您的代码看起来像这样:

$pdo = new PDO( ... params ... );
$stmt = $pdo->prepare("SELECT user_id,user_email,user_pass FROM user_tb where user_email = ? AND user_pass = MD5( ? ) ");

// If you have a User class, you can load it 
// otherwise you get an array
$stmt->setFetchMode(PDO_FETCH_CLASS, 'User');

$stmt->execute(array($_POST["e"], $_POST["p"]));
$user = $stmt->fetch();
这里有一个警告:如果查询日志有可能被其他人读取(例如在共享服务器上运行),那么在将密码发送给PDO之前,您应该首先对密码进行哈希,但是使用“或密码中转义的其他字符的任何人都需要重置,因为哈希将不同

有关获取模式魔术的更多信息,请参见首先,它只是一种用于访问和使用数据库的机制。如果您想学习如何使用PDO库,请查看。不过,您可以创建一个安全的数据库实现,而无需使用PHP的PDO扩展


您当前的实现还不错,但我绝对建议不要通过URI查询传递用户凭据(即,对于更敏感的参数,使用$\u POST而不是$\u GET)。

关于此方面的建议通常有点草率。PDO不会神奇地增加安全性。如果您想保留
DoQuery
函数而不转换字符串连接,那么它不会为您带来任何好处(没有安全性或更简单)。首先需要更改函数签名以将SQL与数据/值分开。也许你会得到一个有用的答案,在你的具体案例中如何做到这一点…是的,我只在这个例子中使用get,但实际上我总是使用POST!谢谢
   function DoQuery($sql, $assoc=0)
   {
        if (!$svr_msconnect) SQLinit();

        $result = mysql_query($sql, $svr_msconnect);

        if (mysql_errno())
        {
            //error alert....
            exit;
        }

        if ($result === TRUE) return array();        
        $res = array();

        if ($assoc)
            while ($row = mysql_fetch_assoc($result))
                array_push($res, $row);
        else
            while ($row = mysql_fetch_row($result)  ) 
                array_push($res, $row);

        return $res;
   } 
     if(isset($_GET["e"]) && isset($_GET["p"])){

         $e = $_GET["e"];
         $p = $_GET["p"];       

         SQLinit();

         $e = mysql_real_escape_string($e);
         $p = mysql_real_escape_string($p);
         $p = md5($p);

        $sql = "SELECT user_id,user_email,user_pass FROM user_tb where user_email='$e' AND user_pass= '$p' ";
        $result = DoQuery($sql,1);
    }
$pdo = new PDO( ... params ... );
$stmt = $pdo->prepare("SELECT user_id,user_email,user_pass FROM user_tb where user_email = ? AND user_pass = MD5( ? ) ");

// If you have a User class, you can load it 
// otherwise you get an array
$stmt->setFetchMode(PDO_FETCH_CLASS, 'User');

$stmt->execute(array($_POST["e"], $_POST["p"]));
$user = $stmt->fetch();