0

防止 SQL 注入使用EXECUTE AS

有人告诉我,防止 SQL 注入的方法之一是在没有登录的情况下创建数据库用户:

CREATE USER User1 WITHOUT LOGIN
Go

GRANT DELETE ON T1 to User1
Go

create proc [dbo].[t1]  (@ID  INT)
with execute as 'user1'
as 
begin

    declare @sql as varchar(500)
    SET @sql = 'delete from T WHERE ID = @ID'
    exec (@sql)

end

我的问题是,由于 User1 没有登录权限,我们如何使用上述程序?

4

1 回答 1

1

确实有这样的技术。
您无需登录即可创建用户,为该用户分配精心选择的权限,然后将该用户的上下文应用于存储过程或单个execute语句。

因为该用户没有登录名,所以没有人可以直接连接到该用户下的服务器。您也不能直接模拟该用户,因为您没有这样做的权限。在这种情况下,“成为”该用户的唯一方法是执行execute as存储过程创建者添加了子句的存储过程或命令(相反,他们确实有权模拟无登录用户)。

虽然这种技术在某些情况下正是您想要的,但我不会使用它来防止您在问题中显示的形式的 SQL 注入。当您必须允许部分受信任的用户提供用于代替对象名称或 SQL 关键字的输入时(即,当用户提供要处理的表的名称时,或者当用户是允许构建自己的where条件,然后您将在不分析的情况下执行)。但是对于您在问题中显示的内容,请在客户端使用参数化语句,并在服务器端使用参数:

create proc [dbo].[t1]
  @ID  INT
as 
begin
  delete from T where ID = @ID;
end

(顺便说一句,不好的例子;参数是int,所以即使你连接它,SQL 注入也是不可能的。)

于 2012-05-08T15:35:37.953 回答