[英]User Specified Stored Procedure Name in SqlCommand
我正在使用以下代碼創建一個SqlCommand
,其中包含用戶在UserStoredProcedureName
指定的存儲過程的名稱:
new SqlCommand(UserStoredProcedureName, connection)
{ CommandType = CommandType.StoredProcedure }
UserStoredProcedureName
沒有對用戶提供的字符串進行UserStoredProcedureName
。 用戶是否只能在數據庫中指定存儲過程的名稱? 用戶是否能夠通過制作惡意存儲過程名稱來執行SQL注入攻擊?
例如:
UserStoredProcedureName = "SELECT * FROM USERS";
sql注入攻擊不會發生在存儲過程本身,但它可能發生在提供的參數/參數上。 有一篇很好的文章可以解釋一下 。
例如,你可以調用SP_MYPROC這很好,但我可以注入第一個參數:
;drop table users
不,如果找不到它們,那么除了失敗之外,每個存儲過程的說法都沒有“驗證”。
一般來說,我認為允許某人用文本編寫然后作為語句執行,特別是如果登錄具有寫訪問權限,這是一個非常糟糕的主意。 如果您想要更安全,可以通過查詢可用的存儲過程來構建下拉菜單,然后當您運行一個時,您可以驗證請求運行的內容與可用的過程名稱之間的1 = 1匹配。
但是為了允許參數方面的自由格式文本,這就是它快速向南移動的地方。
我只熟悉明確指定參數,例如:
sqlcommand.parameters.addwithvalue(x,y);
但在這種情況下,程序的名稱和參數是硬編碼的。
您不應該讓外部代碼提供存儲過程名稱。 理由:存儲過程可以是sp_executesql
,它可以運行您作為第一個參數提供的任何內容 。 它也可以是xp_cmdshell
或類似的。
所以:您仍然應該通過白名單控制輸入存儲過程名稱。 如果名稱來自您自己的代碼,那么它應該不是問題,並且在該場景中對於white-list是不正常的。
注意:如果存儲過程在內部使用EXEC (@sql)
或EXEC sp_executesql @sql
,那么它仍然可以呈現SQL注入攻擊,具體取決於@sql
是否可能包含惡意的非參數化SQL。 請注意, sp_executesql
旨在允許您完全參數化動態SQL,以避免SQL注入攻擊甚至在SQL內部生成的SQL內部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.