6

两种准备好的语句之间到底有什么区别?

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

在模拟的prepared statements的情况下,没有服务器支持,
它可以保证我们反对它吗?

4

2 回答 2

5

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

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

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

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

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

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

于 2013-07-28T14:42:51.277 回答
2

在模拟的prepared statements的情况下,没有服务器支持,它可以保证我们反对它吗?

这是个好问题。

具有讽刺意味的是,在某种程度上,与原生预处理语句的机制完全相同。

准备好的语句的主要思想是使数据文字正确处理并使这种处理不可避免。虽然这种处理的细节并不那么重要。

SQL 注入的主要问题是它本身并不存在。所有的“危险”都来自格式不正确的查询。每次看到注入案例时,都会发现格式不正确的文字是一个原因。

虽然格式正确的查询已经受到保护。

这就是为什么人们根本不应该注意任何注射,而只应该注意正确的格式。
所以准备好的语句以这种或另一种方式进行这样的格式化。

就这样。

于 2013-07-28T15:24:36.453 回答