簡體   English   中英

刪除Where子句中的查詢

[英]Delete Query inside Where clause

是否有可能在Where子句中編寫刪除查詢。

例:

Select ID,Name From MyTable Where ID IN(Delete From MyTable)

這可能很瘋狂,但是讓我解釋一下我的情況。 在我們的報告工具中,我們支持在查詢中輸入SQL。 我們將使用自己的SelectFrom 子句查詢,並結合用戶的where查詢輸入。

例:

Select ID,Name From MyTable Where ("Query typed by user")

在這里,用戶可以鍵入任何類型的where查詢過濾器。

如果他輸入ID = 100,我們的最終查詢將變成這樣

Select ID,Name From MyTable Where (ID=100)

我們的一位客戶問我們,如果有人在哪里輸入刪除查詢作為查詢過濾器,將會發生什么情況。 他認為這可能是安全漏洞。.所以我們在開發環境中嘗試了這種可能性。 但是sql對於以下查詢返回錯誤。

Select ID,Name From MyTable Where ID IN(Delete From MyTable)  

所以最后,我的問題是,還有其他可能性在Where子句Select子句中編寫Delete Query 。如果可能的話,如何限制它?

是。 他們可以運行刪除。 他們可以輸入:

 1 = 1; DELETE FROM MY_TABLE;

甚至在某些方面更糟,(因為您應該有備份):

1 = 0 UNION SELECT SOCIAL_SECURITY_NUMBER, CREDIT_CARD_NUMBER, OTHER_SENSITIVE_DATA FROM MY_SENSITIVE_TABLE;

現在,您的情況很難驗證。 通常,如果您只是傳遞要過濾的值,則可以使用參數化的sql來保存自己。 但是,您還需要讓用戶選擇一列。 在這種情況下,通常我們使用下拉菜單允許用戶選擇預定義的列列表,然后驗證列名服務器端。 我們為用戶提供一個文本框,以輸入要匹配的值,然后對其進行參數化。

這不太可能。 但是他可以做這樣的事情:

Select ID,Name From MyTable Where (ID=100); (DELETE FROM MyTable Where 1 = 1)

通過使用ID=100); (DELETE FROM MyTable Where 1 = 1 ID=100); (DELETE FROM MyTable Where 1 = 1而不是ID=100

我相信您的客戶在談論的是SQL注入,只要您在select語句完成后采取了適當的方法來阻止其他查詢運行,那么讓他們鍵入您想要的任何內容應該沒有問題。 根據我的經驗,在執行select語句時無法刪除任何內容。 只要確保您具有查詢終止符,就可以避免它們寫如下內容。

select column1,column2, from myTable where ID in (1,2); delete from my table

如果您沒有采取適當的措施來防止sql注入的發生,那么這將是客戶的真正擔心。

您可以讓您的SQL報告工具不具有更新或刪除權限,而僅具有讀取權限。 但是,這取決於您是否能夠處理sql注入安全性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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