如何在动态SQL中阻止sql注入

时间:2015-11-05 17:43:47

标签: sql sql-server sql-injection

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

我曾经检查过|在参数中,但现在看来;是一个要检查的分隔符。

它建议使用带有参数的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'

搜索列可以是表格字段的任意随机列表,因此我无法像

那样运行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', ....

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你可以使用参数,没问题。使SQL动态化,但使生成的SQL引用参数。如果需要,无条件地传入<!DOCTYPE html> <html> <link rel="stylesheet" text="text/css" href="movies.css"> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"> </script> <title> Hello World </title> </head> <body> <h1>My Favorite Movies</h1> <input type="text" id="movie" placeholder="Movie"> <button id="enter">Enter</button> <div id="list">Chosen Films:</div> <script type="text/javascript"> </script> </body> </html>参数,只需动态@name子句的name like @name部分即可。如果不搜索名称,只需忽略SQL中的参数。

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

根据您的执行方式,您甚至可以在不使用时删除虚拟参数。

答案 1 :(得分:0)

默认答案:使用预备语句。