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_
功能提供额外的保护?
答案 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)
他们没有逃脱。你可以在这里看到例子: