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

时间:2013-07-28 14:27:57

标签: mysql sql security sql-injection

两种预备陈述之间究竟有什么区别?

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

答案 1 :(得分:2)

  

对于模拟预准备语句,没有服务器支持,有什么用   它保证我们不反对吗?

这是一个很好的问题。

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

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

SQL注入的主要问题是它不存在于自己的注册中。所有"危险"仅来自格式不正确的查询。每次看到注射案例时,您都会发现格式不正确的文字作为原因。

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

这就是为什么一个人根本不应该注意注射,而只是注意正确的格式化 如此准备好的声明以这种或那种方式进行这样的格式化。

这就是全部。