【发布时间】:2009-10-07 19:31:58
【问题描述】:
当我们遇到一个关于 SQL 注入的问题时,我和一位同事正在浏览 SO,这让我们想知道:参数化查询如何在内部工作?您正在使用的 API(假设它支持参数化查询)是否执行连接,将查询与参数结合起来?或者参数是否与查询分开进入SQL引擎,根本不执行连接?
Google 提供的帮助不是很大,但也许我们没有找到合适的东西。
【问题讨论】:
当我们遇到一个关于 SQL 注入的问题时,我和一位同事正在浏览 SO,这让我们想知道:参数化查询如何在内部工作?您正在使用的 API(假设它支持参数化查询)是否执行连接,将查询与参数结合起来?或者参数是否与查询分开进入SQL引擎,根本不执行连接?
Google 提供的帮助不是很大,但也许我们没有找到合适的东西。
【问题讨论】:
参数使其与查询分开进入 SQL 引擎。为参数化查询计算或重用的执行计划,然后由带参数的sql引擎执行查询。
【讨论】:
参数完整地传递到 SQL 服务器,并单独“打包”与指示其类型的元数据,无论是输入还是输出等。正如 Alex Reitbort 指出的那样,之所以如此,是因为参数化语句是服务器级别的概念,而不是只是一种从各种连接层调用命令的便捷方式。
【讨论】:
我怀疑 SQL SERVER 从参数列表连接的给定参数化查询构建完整的查询字符串。
它很可能会解析给定的参数化命令字符串,根据保留字和符号(SELECT、FROM、“、”、“+”等)将其拆分为内部数据结构。在该数据结构中,有诸如表名、文字等值的属性/位置。正是在这里,它将每个传入的参数(从列表中)复制(逐字)到该结构的适当部分。
所以你的@UserName 值为:'x';delete from users --
in 永远不需要转义,只是用作它真正的字面值。
【讨论】:
参数随查询一起传递(不在查询内),并在根据底层数据库通信协议发送时由 API 自动转义。
例如,您可能有
Query: <<<<select * from users where username = :username>>>>
Param: <<<<:username text<<<<' or '1' = '1>>>>>>>>
这不是任何数据库协议实际使用的确切编码,但你明白了。
【讨论】: