-1

在开发过程中,我总是喜欢对大多数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 注入攻击。这种方式是否可以免受此类攻击?

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

4

2 回答 2

0

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

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

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

相反,请酌情使用参数、JSON 序列化程序或适当的 HTML 转义器。

于 2013-07-08T16:55:32.177 回答
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。

于 2013-07-08T17:08:58.550 回答