2015-11-26 64 views
-1

我正在公開一個Web服務,它構造SQL SELECT語句並接受來自控制器的參數。通用功能如下:在ASP.NET中篩選有害的SQL選擇語句

DataTable SqlSelect (string select, string from, string Where, string orderby = "", string groupBy = "") 
{ 
    string sql = "SELECT " + select + " FROM " + from + " WHERE " + where 
    (orderby =="") ? "" : "ORDER BY " + orderby ... 
    //do other stuff 
} 

現在是什麼讓我擔心的是,在給定功能基礎之上,用戶現在可以注入像有害命令:

SqlSelect("DROP TABLE 'TABLENAME'", "INFORMATION_SCHEMA.TABLES", "TABLE_NAME like %%'"); 

,我想阻止。

現在我的問題是:什麼是我可以做,以防止用戶UPDATEMODIFYDELETETRUNCATE表,只允許SELECT聲明(可以使用類似只讀?)

注意的最好的事情:這類似於this question,但用戶正在使用PHP,而我在ASP.NET MVC中,我也想在這裏實現的只是允許SELECT或'GET'語句。

+0

可能的重複[如何防止SQL注入在PHP?](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) –

+0

@BrandonMoretz主席先生,您可能不會考慮,該用戶正在詢問有關PHP框架。所以提供的解決方案也建議使用PHP插件 –

+1

一種方法是確保連接到數據庫的帳戶是隻讀的。那麼你只限於DOS類型的攻擊。而且您還必須確保該帳戶保持只讀狀態。但最後這是一個壞主意。 –

回答

0

利用數據讀取器https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx。當你調用ExecuteReader()時,你可以捕獲任何異常。

但是我會建議不要將這種通用功能暴露給客戶端代碼。您應該只使用類似存儲庫模式的方式,通過適當的數據層提供對數據的受控訪問。

+0

這個數據讀取器意味着我不能執行其他命令嗎?是否有可能使用Reader來更新記錄?我閱讀文檔,但沒有提供我關心的具體細節 –

1

不要這樣做。您需要參數化查詢,這意味着您不能接受SQL文本作爲輸入。我發現許多開發人員嘗試檢測SQL注入攻擊,並且我幾乎總是找到一種通過其邏輯的方式。

如果您需要能夠基於數據庫中的任何表動態構建任何SELECT查詢,那麼您可以輕鬆創建一個指示該表的類,選擇列以及謂詞列作爲枚舉的位置,以及where謂詞。連接基於此類的SQL文本並使用SqlParameters包含謂詞值。

這只是一個例子,但肯定你不想接受SQL文本。

+0

是的,實際上我做了什麼,之後我會發布我的解決方案(如果我不忙)。不管怎麼說,還是要謝謝你。 –