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')");
}
Run Code Online (Sandbox Code Playgroud)
(以上代码纯粹是假设的,仅供参考.)
如果它们没有自动转义,PDO是否会mysql_在这种情况下为这些功能提供额外的保护?
只有准备好的语句才能提供自动转义功能,假设您没有启用魔法引号这样的丑陋.并且只有params中的数据被转义,而不是在准备语句时已经存在于SQL字符串中的任何内容.
如果您想要自动转义的好处,您必须准备一份声明并单独提供数据.
$sth = $dbh->prepare("SELECT * FROM users WHERE username=? AND password=?");
$sth->execute(array($username, $password));
Run Code Online (Sandbox Code Playgroud)
否则,你mysqli_query和朋友几乎没有任何保护.(我甚至拒绝提及 mysql_query,因为没有自尊的PHP程序员再使用它了.哦,等等......嗯,这是它在这里唯一提到的.)