2

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_在这种情况下对函数提供任何额外的保护?

4

2 回答 2

5

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

如果您想要自动转义的好处,您必须准备一个语句并单独为其提供数据。

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

mysqli_query否则,你和朋友们几乎得不到保护。(我什至拒绝提及 mysql_query,因为没有自尊的 PHP 程序员再使用它。哦,等等..该死的。好吧,这是这里唯一提到的。)

于 2012-11-25T03:48:35.127 回答
3

他们没有逃脱。您可以在此处查看示例:

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

于 2012-11-25T03:48:09.363 回答