Операторы PDO автоматически экранируются?

Являются ли заявления PHP PDO автоматически экранированными или только подготовленными операторами?

Например, предположим, что $username и $password являются пользовательскими вводами. Является ли следующий код защищенным или он уязвим для инъекций?

 $dbh = new PDO("mysql:host=localhost;dbname=mydb", $my_mysql_username, $my_mysql_password); $sth = $dbh->query("SELECT * FROM users WHERE username='$username' AND password='$password'"); $result = $sth->fetch(); if(!$result){ $dbh->exec("INSERT INTO users (username, password) VALUES ('$username', '$password')"); } 

(Вышеприведенный код является чисто гипотетическим, например, только для целей).

Если они не автоматически экранируются, делает ли PDO дополнительную защиту над функциями mysql_ в этой ситуации?

Related of "Операторы PDO автоматически экранируются?"

Только подготовленные заявления обеспечивают автоматическое экранирование, предполагая, что у вас нет какого-то уродства, как включенные магические кавычки. И только данные в параметрах экранируются, а не все, что уже есть в строке SQL при подготовке инструкции.

Если вы хотите воспользоваться преимуществами автоматического экранирования, вам придется подготовить инструкцию и передать ее отдельно.

 $sth = $dbh->prepare("SELECT * FROM users WHERE username=? AND password=?"); $sth->execute(array($username, $password)); 

В противном случае вы не получите никакой защиты от mysqli_query и друзей. (Я отказываюсь даже упоминать mysql_query , потому что ни один уважающий себя программист PHP не использует его больше. О, подождите … черт возьми, ну, это единственное упоминание, которое оно получает здесь.)

Они не сбежали. Здесь вы можете увидеть примеры:

http://www.phptherightway.com/#pdo