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