2012-05-08 51 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