簡體   English   中英

SqlCommand中的用戶指定的存儲過程名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM