2014-09-04 32 views
1

我一直在試圖確保我的代碼不容易出現臭名昭着的SQL注入攻擊。這個問題涉及到查詢字符串,遺留代碼,我管理有哪些應用內聯SQL實例:用於查詢字符串的SQL注入技術

string query = @"SELECT * FROM [Order] 
    WHERE ([Id]=" + Request.QueryString[@"oid"] + ");"; 

顯然,這是不好的,它會採取攻擊。我的問題是足夠的嗎?

command.Parameters.AddWithValue("@OrderId", Request.QueryString[@"oid"]); 

所以現在查詢有一個參數,它正在傳遞一個值。我知道它有某種形式的編碼。但是,這是否足以像任何惡意攻擊者利用該查詢字符串一樣?那麼我應該在查詢字符串上做Encode嗎?這樣它會安全地編碼,以避免被進一步利用?

關於此事的一些澄清將有所幫助。

+0

是的,這就夠了。 – Zer0 2014-09-04 16:49:33

+0

你應該看看[我們可以停止使用AddWithValue()了嗎?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)並停止使用'.AddWithValue()' - 它可能會導致意想不到的和令人驚訝的結果... – 2014-09-04 16:57:10

回答

4

這就夠了嗎?

不 - 你還需要查詢更改爲

string query = @"SELECT * FROM [Order] 
    WHERE ([Id][email protected]);"; 

我知道它有某種形式的編碼

不,它使用的實際價值,但它不會將它注入到SQL語句中。它將其視爲字面字符串,因此無法包含標點符號或惡意代碼,這些代碼將被解釋爲SQL。

EDIT

我可能誤解 - 則可能需要,如果它包含URL編碼字符(%20&等)進行URL解碼值,但沒有編碼(或解碼)是必要防止SQL注入。

+0

我知道查詢必須更改爲使用該參數,應該添加到問題,對不起。所以'Parameters.AddWithValue'應該是足夠的,因爲它如何轉換? – Greg 2014-09-04 16:53:10

+0

@Greg它不會轉換。它將按原樣插入字符串值。您無需擔心編碼或轉義字符。 – 2014-09-04 16:55:39