数据库级别的参数化查询会发生什么
What happens to a parameterized query at database level
我正在处理由一个漏洞扫描器标记的几个 SQL 注入错误,并且正在研究应用程序中的一些其他实现,其中参数化查询用于数据库交互。
我在探查器中观察到所有参数化查询实际上都在调用 sp_executesql
过程。所以,
1) 任何库的所有参数化查询实现实际上都只是调用这个存储过程吗?
2)如果否,那么参数化查询是否最终转换为普通字符串查询并被执行?
我无法回答 1)。但是您可以将参数名称以及不同数量的参数传递给 sp_executesql (Transact-SQL)。所以 sp_executesql
不是这里的限制因素。
- 数据库不会为参数化查询创建串联字符串。它按原样编译 SQL 命令字符串,即使用参数名称并生成可执行查询。您可以将其视为一种方法。然后将参数值作为实际参数传递给此“方法”。
除了击败 SQL 注入外,这还有一个好处,即数据库可以缓存编译的查询并在下次执行相同的 SQL 命令时重新使用它,即使参数值不同。
另一个优点是您不必关心文字的正确表示。这对于 date/time 文字特别有价值(这往往非常复杂,因为格式是特定于文化的,并且可能会有所不同)。您无需关心转义字符串中的引号。
我正在处理由一个漏洞扫描器标记的几个 SQL 注入错误,并且正在研究应用程序中的一些其他实现,其中参数化查询用于数据库交互。
我在探查器中观察到所有参数化查询实际上都在调用 sp_executesql
过程。所以,
1) 任何库的所有参数化查询实现实际上都只是调用这个存储过程吗?
2)如果否,那么参数化查询是否最终转换为普通字符串查询并被执行?
我无法回答 1)。但是您可以将参数名称以及不同数量的参数传递给 sp_executesql (Transact-SQL)。所以 sp_executesql
不是这里的限制因素。
- 数据库不会为参数化查询创建串联字符串。它按原样编译 SQL 命令字符串,即使用参数名称并生成可执行查询。您可以将其视为一种方法。然后将参数值作为实际参数传递给此“方法”。
除了击败 SQL 注入外,这还有一个好处,即数据库可以缓存编译的查询并在下次执行相同的 SQL 命令时重新使用它,即使参数值不同。
另一个优点是您不必关心文字的正确表示。这对于 date/time 文字特别有价值(这往往非常复杂,因为格式是特定于文化的,并且可能会有所不同)。您无需关心转义字符串中的引号。