模拟准备好的陈述与实际准备的陈述

Gio*_*nJh 6 mysql sql security sql-injection

两种准备好的陈述之间究竟有什么区别?

我认为真正准备好的语句需要服务器端支持,它在解析和编译sql代码的模式/模板之后接受参数,并且,我想,这就是保证我们防止sql注入的原因.

对于模拟准备好的语句,没有服务器支持,
它能保证我们不反对它吗?

Ran*_*eed 5

您是对的,服务器必须支持真正的准备好的语句。真正的准备意味着分两步查询数据库。

第一步包括发送一个查询模板,服务器可以预编译。数据库引擎还提前准备了执行计划(主要是将使用哪些索引来为实际查询提供服务)。

第二步是为占位符提供实际值并使用这些参数运行实际查询。

这通常允许更快地执行几个类似的查询,因为 1. 查询已经被预编译(已经计算了执行计划)并且 2. 仅随后发送了参数值。

模拟查询只是一种语法糖,它只允许更容易地发送(而不是更快地执行)多个连续的类似查询。每次执行模拟查询时,都会将完整的 SQL 语句发送到服务器。

当服务器不支持真正的预处理语句时,仍然建议使用模拟预处理语句,因为驱动程序仍然会为您处理转义值,从而减少 SQL 注入的可能性。