如何防止 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.
中的参数
如果您不想对参数名称进行硬编码,请将它们命名为 param1
、param2
等
根据您的执行方式,您甚至可以在不使用虚拟参数时去掉它们。
默认答案:使用准备好的语句。
这是一个老话题,但我仍然有问题,所以想在这里获得一些新想法。
我以前查过|在参数中,但现在看来;也是要检查的分隔符。
建议使用带参数的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.
如果您不想对参数名称进行硬编码,请将它们命名为 param1
、param2
等
根据您的执行方式,您甚至可以在不使用虚拟参数时去掉它们。
默认答案:使用准备好的语句。