Являются ли заявления 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_
в этой ситуации?
Только подготовленные заявления обеспечивают автоматическое экранирование, предполагая, что у вас нет какого-то уродства, как включенные магические кавычки. И только данные в параметрах экранируются, а не все, что уже есть в строке SQL при подготовке инструкции.
Если вы хотите воспользоваться преимуществами автоматического экранирования, вам придется подготовить инструкцию и передать ее отдельно.
$sth = $dbh->prepare("SELECT * FROM users WHERE username=? AND password=?"); $sth->execute(array($username, $password));
В противном случае вы не получите никакой защиты от mysqli_query
и друзей. (Я отказываюсь даже упоминать mysql_query
, потому что ни один уважающий себя программист PHP не использует его больше. О, подождите … черт возьми, ну, это единственное упоминание, которое оно получает здесь.)
Они не сбежали. Здесь вы можете увидеть примеры: