prepared语句相对于pdo::quote的安全优势

v8wbuo2f  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(365)

准备好的声明是否比 PDO::quote 在一次性查询中?
例如,如果我有以下只执行一次的查询,与下面准备的等价查询相比,有什么缺点吗?

// Using PDO::quote
$stmt = $db->query("SELECT * FROM `config` WHERE name = {$db->quote($name)} LIMIT 1");

// Using prepared statement
$stmt = $db->prepare("SELECT * FROM `config` WHERE name = :name LIMIT 1");
$stmt->execute(['name' => $name]);

我读到,由于两步执行,准备好的语句稍微慢一点。初始准备步骤是在数据库服务器上执行的,还是由pdo扩展处理的?

f45qwnt8

f45qwnt81#

摘自文件:
如果使用此函数生成sql语句,强烈建议使用pdo::prepare()来准备带有绑定参数的sql语句,而不是使用pdo::quote()将用户输入插入sql语句。带绑定参数的预处理语句不仅更易于移植、更方便、不受sql注入的影响,而且通常比插值查询执行得更快,因为服务器端和客户端都可以缓存已编译的查询形式。

c7rzv4ha

c7rzv4ha2#

在一次性查询中,prepared语句是否比pdo::quote具有任何安全优势?
是:它适用于数值参数和字符串。 PDO::quote() 只适用于字符串和日期。
我读到,由于两步执行,准备好的语句稍微慢一点。
如果是这样的话,除非你的网络速度很慢或者需要修复,否则差别是微不足道的。不要担心它,除非你在一个非常,非常高的规模运作(提示:你没有在这个规模运作)。
初始准备步骤是在数据库服务器上执行的,还是由pdo扩展处理的?
或者,取决于 PDO::ATTR_EMULATE_PREPARES 属性。如果你把这个设为真,那么 prepare() 是一个no-op(除了将sql字符串保存在变量中),稍后 execute() ,它将您的参数插入到sql字符串中,并在不准备查询的情况下执行查询。
如果 PDO::ATTR_EMULATE_PREPARES 如果为false,则执行服务器端准备。dbms在内存中保存一些对象来表示查询,只有在execute调用中单独发送参数值后,它才能执行准备好的查询。

相关问题