如何使用SQL注入的存储过程安全创建select / update / delete语句

时间:2013-07-08 16:52:54

标签: sql-server stored-procedures sql-injection

我总是喜欢在开发期间对大多数 SQL命令使用存储过程。 select语句的一个例子。我使用这个Store porcedure

ALTER proc [dbo].[sp_select] (@tbl varchar(200),@col varchar(max),@cond varchar(max))
as
declare @query varchar(max)
if(@cond!=NULL)
begin
set @query='select '+@col+' from '+@tbl+' where '+@cond
end
else
begin
set @query='select '+@col+' from '+@tbl 
end
exec(@query)
GO

我很少有意识 SQL注入 atacks。这种方式是否安全,不受此类攻击?

任何建议都将不胜感激......

2 个答案:

答案 0 :(得分:0)

您的存储过程完全没有意义,只会使编写安全代码变得更加困难。

SQL注入并不神奇;它只是输入带引号的字符串 存储过程不会神奇地抵御它;他们只是鼓励您将用户输入作为参数传递(您没有这样做)。

正确防止SQL(以及其他形式)注入的方法是将应用程序代码更改为永远不会将任意文本(尤其是用户输入)连接到结构化语言(例如SQL,HTML)或JSON)。

相反,请根据需要使用参数,JSON序列化程序或适当的HTML转发器。

答案 1 :(得分:0)

没有。它非常容易受到SQL注入攻击。例如,假设有人

exec dbo.sp_select '@Dummy', '(Select Null) As x; Update Employee Set Salary = 1000000 Where EmployeeName = ''me''; Declare @Dummy Table (i int); Select Null ', null

然后构建和执行的查询是

select (Select Null) As x; Update Employee Set Salary = 1000000 Where EmployeeName = 'me'; Declare @Dummy Table (i int); Select Null  from @Dummy

并且你应该只做选择的存储过程刚刚将我的工资更新为1,000,000。