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