PHP - PDO 引用是否免受 SQL 注入(inject)攻击?

标签 php mysql pdo sql-injection

$id  = trim((int)$_GET['id']);
$sql = 'SELECT * FROM users WHERE id = ' . $db->quote($id) . ' LIMIT 1';
$run = $db->query($sql)->fetch();

PDO 的 quote 方法作为准备好的语句是否安全?或者我必须在我的脚本中一直使用准备好的语句?

最佳答案

基本上 quote() 作为准备语句是安全的,但它取决于 quote() 的正确实现,当然也取决于它的后续用法。此外,必须考虑所用数据库系统/PDO 驱动程序的实现才能回答这个问题。

虽然准备好的语句可以是底层数据库协议(protocol)(如 MySQL)的一个特性,然后将在数据库服务器上“准备”(服务器站点准备 ),它不一定必须并且也可以在客户端站点上进行解析(客户端站点准备)。

在 PDO 中,这取决于:

  • 驱动程序/数据库系统是否支持服务器端准备好的语句?
  • PDO::ATTR_EMULATE_PREPARES 必须设置为 false(如果驱动程序支持则为默认值)

如果不满足其中一个条件,PDO 会回退到客户端站点准备,再次在后台使用类似quote() 的东西。


结论:

使用准备好的语句没有坏处,我鼓励您使用它们。即使您显式使用 PDO::ATTR_EMULATE_PREPARES 或者您的驱动程序根本不支持服务器站点准备,准备好的语句也会强制执行一个工作流程,其中不会忘记引用是安全的。另请检查@YourCommonSense 的回答。他对此进行了详细说明。

关于PHP - PDO 引用是否免受 SQL 注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22066243/

相关文章:

php - urlencode 问题

php - MySQL 变量,GROUP_CONCAT,以及稍后使用它

php - Redbeanphp - 多条件安全查询

php - URL Rewrite 在 cakephp 中创建子域

mysql 类似整数的运算符给我比 = 运算符更好的结果

mysql - 在仅填充 Facebook ID 的 MySql 中创建用户表?

php - Curl 无法验证 Verisign 颁发的通配符 SSL 证书

MySQL ALTER 表多列键

php - 在 Codeigniter 中动态加载数据库连接数据

php - 数据库返回错误,无法弄清楚我哪里出错了?