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

Prevent SQL injection in queries with exec or execute

提问人:Pablo pas 提问时间:8/30/2017 最后编辑:boop_the_snootPablo pas 更新时间:8/30/2017 访问量:501

问:

我正在使用 Visual Studio 2017 开发报告 Web。我所有的 SQL 查询都已参数化并正常工作。问题出在一些具有 exec 命令的查询中,例如在过程中。

例如:

而不是
我把
SELECT * FROM tabla WHERE id=@idexec('SELECT * FROM tabla WHERE id=@id')

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

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

多谢!

asp.net sql-server sql-injection

评论

0赞 Panagiotis Kanavos 8/30/2017
使用查询或将查询转换为函数/存储过程,并使用参数调用它们。sp_executesql
0赞 Panagiotis Kanavos 8/30/2017
另一种选择是使用 EF 并使用 LINQ 构造查询。这甚至允许您根据用户的选择构建实际查询,例如使用不同的条件、字段Where()OrderBy()

答:

4赞 Damien_The_Unbeliever 8/30/2017 #1

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

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

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