是什么让PDO比普通的mysql更安全?

时间:2012-03-21 04:13:59

标签: mysql pdo sql-injection

我一次又一次地读到Stackoverflow,我应该使用PDO来访问MySQL,因为它更安全。我最近使用一些在线教程将一些select和insert语句更改为PDO,并发现它们与我的原始代码非常相似。这让我觉得也许我错过了一些东西。

所以,我的问题是what makes PDO safer than normal mysql?有什么能使这些例子更安全吗?

编辑:我已粘贴下面的插入代码。如果您能看到一些让它更安全的方法,请告诉我。

include 'dataB3S3.php';

try {
        $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
        /*** connect to DB ***/


        /*** INSERT data ***/
        $count = $dbh->exec("INSERT INTO $table(`instance` ,`uid`,`teid`) VALUES (NULL,'$userID','$teid')");

         /*** display the id of the last Auto INSERT ***/
        $lastInsertValue=$dbh->lastInsertId();

        /*** close the database connection ***/
        $dbh = null;  
}

2 个答案:

答案 0 :(得分:5)

你错过了一个主要的好处,prepared statements。使用它们而不是直接在查询中嵌入变量就像示例代码一样,可以更好地防止意外的SQL注入漏洞。

答案 1 :(得分:1)

是。 ceejayoz有一个很好的观点,但对我来说,除了过滤和清理数据之外,PDO实际上可以将生成的数据集注入完整的成熟对象中。

我从this awesome SO post了解了一段时间。

为了有一个代码示例,我将在这里粘贴电子满意代码,因为我手边没有可用的代码示例,但相信我,我已多次借用这个概念:

class Student {

    public $id;
    public $first_name;
    public $last_name

    public function getFullName() {
        return $this->first_name.' '.$this->last_name
    }
}

try 
{
    $dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)

    $stmt = $dbh->query("SELECT * FROM students");

    /* MAGIC HAPPENS HERE */

    $stmt->setFetchMode(PDO::FETCH_INTO, new Student);


    foreach($stmt as $student)
    {
        echo $student->getFullName().'<br />';
    } 

    $dbh = null;
}
catch(PDOException $e)
{
    echo $e->getMessage();
}

并不是说我是ZF爱人,但是Zend Framework实际上在他们的抽象中使用了非常棒的PDO。查看ZEND_DB_相关类,了解与有价值的库一起使用时PDO的强大功能。

作为奖励,大多数(如果不是全部)此框架的类都可以独立运行或作为模块化组件运行。我自己在小项目中使用了很多这些项目,它们的库实际上非常易于使用和记录良好,并且在许多环境中进行了大量的尝试和测试。

快乐的编码!