使用exec或execute阻止查询中的SQL注入

时间:2017-08-30 06:33:50

标签: asp.net sql-server sql-injection

我正在使用Visual Studio 2017开发报告网站。我的所有 SQL查询都已参数化并且正常运行。问题出在一些像过程一样有exec命令的查询中。

例如:

而不是SELECT * FROM tabla WHERE id=@id 我放了exec('SELECT * FROM tabla WHERE id=@id')

exec 案例不起作用。错误消息是:

  

必须声明标量变量“”@id“”。“& vbCrLf&”必须声明标量变量“”@id“”。“   有人知道可能的解决方案吗?

非常感谢!

1 个答案:

答案 0 :(得分:4)

如果您在"可参数化"中使用参数位置(即您没有尝试参数化表/列名称),您可以使用sp_executesql继续使用参数:

exec sp_executesql N'select * from tabla where id=@id',N'@id int',@id = @id

使用exec创建一个新的上下文,该上下文无法访问任何外部变量/参数,但sp_executesql允许您将变量显式传递到内部上下文中。 (并不要求内部和外部变量名称相同,但保持它是最简单的)