[英]Delete Query inside Where clause
是否有可能在Where子句中編寫刪除查詢。
例:
Select ID,Name From MyTable Where ID IN(Delete From MyTable)
這可能很瘋狂,但是讓我解釋一下我的情況。 在我們的報告工具中,我們支持在查詢中輸入SQL。 我們將使用自己的Select和From 子句查詢,並結合用戶的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.