2017-03-16 171 views
1

我有一個SQL請求,我需要的數據連接成的要求:TryParse防止SQL注入嗎?

if (dataChoosen != "randomValue") 
{ 
    sCondition = " WHERE RandomField = '" + dataChoosen + "' "; 
}    
cd.CommandText = "SELECT xData FROM table " + sCondition + "GROUP BY xxx"; 

當我需要連接的情況下,我不認爲我可以用一備的要求嗎?

此外,我已經tryparse'dataChoosed'值,因爲它來自一個文本框,我需要一個整數。那麼tryparse足以防止SQL注入?

+10

您應該使用參數。將SQL與參數連接起來沒有任何問題。 – SLaks

+6

請務必使用參數,另請參見[最佳實踐 - 執行Sql語句](http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements)以獲取更多信息和希望。 – Igor

+2

「選擇」的過去分詞是「選擇」,而不是「選擇」。如果變量名稱在其中有正確的拼寫,它會讓其他人更容易查看你的代碼:) –

回答

-2

是否[BLANK]防止SQL注入?

除非[BLANK]是「參數」,否則答案總是否定的。

+0

反對票?爲什麼? – aquinas

+1

不知道。不是我。也許它太簡單了,而'空白'應該是'一些新的想法關於SQL注入預防'。讓我們忽略這個「新點子」並不新鮮。 –

+0

@AndrewMorton,是的,我主要認爲這很有趣/可怕。上面的評論「你應該使用參數。」 10票。 「總是使用參數」6。這個答案基本上說的是完全一樣的東西:總是使用參數,因爲像Dmitry Bychenko之類的原因,以及其他許多原因(多字節字符漏洞(https://security.stackexchange.com/questions/9908/multibyte-character- exploits-php-mysql)等):3票反對。 – aquinas

2

我只是使用參數,沒有理由不這樣做。

if (dataChoosed != "randomValue") 
{ 
    sCondition = " WHERE RandomField = @dataChoosed "; 
}    
cd.CommandText = "SELECT xData FROM table " + sCondition + "GROUP BY xxx"; 
cd.Parameters.Add("@dataChoosed", SqlDbType.VarChar).Value = dateChoosed; 
+0

永遠不要使用AddWithValue:[我們可以停止使用AddWithValue()了嗎?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already /) –

+0

@AndrewMorton怎麼樣? – Kevin

+0

如果OP爲他們提到的整數值使用VarChar列(它們不應該是這樣),那就可以了。如果它確實是VarChar類型,那麼最好也指定長度與數據庫中的聲明相同。 [最佳實踐 - 執行Sql語句]中有更多信息(http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements#t=201703162000398457387)(正如伊戈爾的評論中所鏈接的那樣)。 –

1

不,你在安全方面不。即使dataChoosed是一個無辜的整數值,壞男孩可以用,比如說,負值格式傷害你:

// It's good old "-1", with a bit strange format 
    // (let use "delete from table commit;" as an injection) 
    string dataChoosed = "1'; delete from table commit; --1"; 

    // A little hack: let "-" sign be... 
    CultureInfo hacked = new CultureInfo("en-US"); 
    hacked.NumberFormat.NegativeSign = "1'; delete from table commit; --"; 
    Thread.CurrentThread.CurrentCulture = hacked; 

    if (dataChoosed != "randomValue") 
    { 
     int v; 

     // since "1'; delete from table commit; --1" is of correct fotmat it will be parsed 
     if (int.TryParse(dataChoosed, out v)) 
      sCondition = " WHERE RandomField = '" + dataChoosed + "' "; 
    }    

    cd.CommandText = "SELECT xData FROM table " + sCondition + "GROUP BY xxx"; 

而且,榮辱與共!我的桌子在哪兒?該命令文本將

SELECT xData FROM table = '1'; delete from table commit; --1'GROUP BY xxx 

這是efficently 查詢:

SELECT xData FROM table = '1'; -- the innocent one 
    delete from table commit;  -- an arbitrary query from the attacker 

(我已經刪除註釋掉--1'GROUP BY xxx片段)

使用參數,不要誘惑我們。請注意,您不想更改代碼:您只需在Windows中更改區域設置。