我总是喜欢在开发期间对大多数 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。这种方式是否安全,不受此类攻击?
任何建议都将不胜感激......
答案 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。