我正在研究由漏洞扫描程序之一标记的几个SQL注入错误,并且正在研究应用程序中的其他一些实现,其中参数化查询用于数据库交互。
我在探查器中观察到,所有参数化查询实际上都在调用sp_executesql过程。
1)具有任何库的所有参数化查询实现实际上只是在调用此存储过程吗?
2)如果否,那么最后将参数化查询转换为普通字符串查询并执行吗?
我无法回答1)。但是您可以将参数名称以及不同数量的参数传递给sp_executesql(Transact-SQL)。因此,sp_executesql这里不是限制因素。
2)数据库并没有创建参数化查询一个连接字符串。它按原样(即使用参数名称)编译SQL命令字符串,并生成可执行查询。您可以将其视为一种方法。然后将参数值作为实际参数传递到此“方法”。
除了克服SQL注入之外,这还具有数据库可以缓存已编译查询并在下次执行同一SQL命令(甚至具有不同参数值)时再次使用它的优点。
另一个优点是,您不必关心字面量的正确表示。这对于日期/时间文字特别有价值。您无需担心转义字符串中的引号。