PHP PDO 语句是自动转义的,还是只有准备好的语句?
例如,假设 $username
和 $password
是用户输入。下面的代码是安全的,还是容易被注入(inject)?
$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
和 friend 几乎没有任何保护。 (我什至拒绝提及 mysql_query
,因为没有自尊的 PHP 程序员再使用它了。哦,等等..该死的。好吧,这是这里唯一提到它的地方。 )
关于php - PDO 语句是否自动转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13548059/