php - PDO 语句是否自动转义?

标签 php mysql pdo

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/

相关文章:

mysql - MySQL中两列的自定义顺序

java - executeUpdate 异常

php - 如何在 PHP 字符串比较中模拟 MySQLs utf8_general_ci 排序规则

php - 是否可以编写一个输出 JSON 的 SQL 函数?

php - 在 Woocommerce 上的产品中设置产品类别术语

php - 什么样的代码可以进入PDO交易?

php - 更新了查询,显示 PDO 中的旧数据

php - 如何仅显示自日期以来和截止日期的数据

mysql - 如何在MYSQL的FROM子句中指定更新的目标表?

php - 在 laravel for sqlite 中找不到 pdo 异常驱动程序