Что делает PDO более безопасным, чем обычный mysql? - PullRequest
1 голос
/ 21 марта 2012

Снова и снова я читал на Stackoverflow, что я должен использовать PDO для доступа к MySQL, потому что это безопаснее. Недавно я изменил некоторые из своих операторов выбора и вставки в 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 ]

5 голосов
/ 21 марта 2012

Вы пропустили одно из главных преимуществ, подготовленные заявления .Использование их вместо непосредственного встраивания переменных в ваш запрос, как в примере кода, защищает вас от случайных уязвимостей SQL-инъекций.

1 голос
/ 21 марта 2012

Да. У ceejayoz есть хорошая точка зрения, но для меня, кроме фильтрации и очистки данных, PDO может фактически внедрить полученные наборы данных в полноценные объекты.

Я узнал об этом некоторое время назад от этого удивительного SO сообщения .

Ради примера кода я вставлю сюда код e-assign, поскольку у меня нет такого примера кода, который можно опубликовать, но поверьте, я много раз заимствовал эту концепцию:

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 при использовании в сочетании с достойной библиотекой.

В качестве бонуса большинство, если не все классы этой платформы, работают автономно или в виде модульных компонентов. Я сам использовал многие из них в небольших проектах, их библиотеки на самом деле довольно просты в использовании и хорошо документированы, а также очень испытаны и протестированы во многих средах.

Удачного кодирования!

...