2014-06-25 204 views
0

是否有可能在內寫刪除查詢Where子句刪除查詢Where子句

例子:

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

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

實施例:

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

在這裏,用戶可以鍵入任何種類的其中查詢過濾器..

如果他類型,如ID = 100我們的最終查詢變成這樣

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

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

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

所以最後,我的問題是,有沒有其他的可能性寫刪除查詢Where子句選擇條款。如果有可能,我怎麼能限制呢?

+2

是的!如果他們輸入他們的查詢,如「; GO; DELETE FROM MyTable」。有很多變化,所以你真的需要考慮停止SQL注入的方法。避免這種情況的最簡單方法是參數化查詢並將用戶文本作爲參數傳遞。 –

+0

是的,這是非常危險的。他們可以把類似1 = 1;從表中刪除。查找sql​​注入。 – SQLChao

+0

這是SQL注入,你不應該讓用戶鍵入他/她想要的任何類型的查詢。如果他們添加的查詢是'ID = 100);從MyTable中刪除;'? – Lamak

回答

2

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

1 = 1; DELETE FROM MY_TABLE; 

或者更糟糕,在某些方面,(因爲你應該有備份):現在

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

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

+0

感謝您的幫助 – kombsh

1

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

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

使用ID=100); (DELETE FROM MyTable Where 1 = 1代替ID=100

0

我相信你的客戶講的是SQL注入,只要你採取適當的方法來阻止其他查詢在你的select語句完成後運行,那麼你應該沒有問題讓他們鍵入你想要的任何東西。 根據我的經驗,當您執行select語句時無法刪除任何內容。 只要確保您有查詢終止符字符,以便他們不寫下面的內容。

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

如果您沒有采取適當的措施來防止SQL注入發生,這將是您客戶的一個有效擔心。

你可以讓你的SQL報告工具沒有更新或刪除權限,只是讓它具有讀取權限。但是,這取決於你們是否處理了SQL注入安全問題。

+0

感謝您的幫助 – kombsh