2012-05-08 35 views
0

防止SQL注入EXECUTE使用EXECUTE AS防止SQL注入使用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没有登录权限?

+1

我也不懂这是如何防止SQL注入攻击。上述SP不能有SQL注入,因为没有参数,但如果有参数,它们被连接成是execed SQL字符串,但仍然没有阻止,除了给用户1有限的权限。因此,它不会阻止somone使用SQL注入将数千个虚假记录插入到表中。 –

+0

我改变了代码,你可以重新格式化请 –

回答

1

确实是有这样的技术。
您没有登录创建一个用户,assing精心挑选的权限给该用户,然后应用用户的上下文或者存储过程或个人execute语句。

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

虽然这种技术正是你在某些情况下想要什么,我不会用它来防止SQL注入你表现出对这个问题的形式。当您必须允许部分信任的用户提供用于代替对象名称或SQL关键字的输入时(例如,当用户提供要使用的表的名称,或者当用户是允许构建他们自己的where条件,然后在不分析的情况下执行)。但对于那种在服务器端的东西,你都出现在的问题,在客户端使用parametrized statements和参数:

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

(坏榜样顺便说一句,参数为int,所以SQL注入是不可能的即使您连接它。)

+0

我刚刚发布了一个不好的例子,但试图理解http://www.sqlskills.com/BLOGS/KIMBERLY/post/Little-Bobby-Tables-SQL-Injection-and-EXECUTE -AS.aspx然而,我不明白这部分。如果用户不被允许登录,客户端应用程序如何执行proc(我们如何使用模拟) –

+0

OK @ID需要varchar才能发生SQL注入。我不好谢谢你。 –

+0

@SQLLearner您可以在不同的用户下登录。然后执行存储过程,临时将您的权限更改为分配给无登录用户的权限。 – GSerg