PDO语句是否会自动转义?

时间:2012-11-25 03:42:34

标签: php mysql 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_功能提供额外的保护?

2 个答案:

答案 0 :(得分:5)

只有准备好的语句才能提供自动转义功能,假设您没有启用魔法引号这样的丑陋。并且只有params中的数据被转义,而不是在准备语句时已经在SQL字符串中的任何内容。

如果您想要自动转义的好处,您必须准备一份声明并单独提供数据。

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

否则,你对mysqli_query和朋友几乎没有任何保护。 (我甚至拒绝提及 mysql_query,因为没有自尊的PHP程序员再使用它了。哦,等等......嗯,这是它在这里唯一提到的。)

答案 1 :(得分:3)

他们没有逃脱。你可以在这里看到例子:

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