$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/