如何防止 sql 动态注入 SQL

How to prevent sql injection in dynamic SQL

这是一个老话题,但我仍然有问题,所以想在这里获得一些新想法。

我以前查过|在参数中,但现在看来;也是要检查的分隔符。

建议使用带参数的sp_executesql来防止SQL注入,但我不确定是否可以做到。

我尝试做的是从客户端收集过滤器和 运行 动态 SQL 以获得结果,例如,从客户端,我可以将带有以下过滤器的请求发送到 SQL:

id=1234 name=david date=2014/01/01

我会创建动态 sql 喜欢

select * 
from members 
where id = 1234 
  and name like 'david%' 
  and crea_date = '2014/01/01'

搜索列可以是 table 的任何随机字段列表,所以我不能 运行 sp_executesql

sp_executesql N'select * from members where id=@id and name like @name and crea_date=@crea_date',N'@id int,@name nvachar(100),@crea_date datetime', ....

有什么建议吗?

可以使用参数,没问题。使 SQL 动态化,但使生成的 SQL 引用参数。如果需要,无条件传递 @name 参数,只需将 where 子句的 name like @name 部分设为动态即可。如果您不搜索名称,只需忽略 SQL.

中的参数

如果您不想对参数名称进行硬编码,请将它们命名为 param1param2

根据您的执行方式,您甚至可以在不使用虚拟参数时去掉它们。

默认答案:使用准备好的语句。