2017-03-16 9 views
1

私はリクエストにデータを連結する必要があるSQL要求を持っている:私は条件を連結する必要がTryParseはSQLインジェクションから保護しますか?

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

として、私は私が準備された要求を使用することができると思いませんか?

また、私はすでに 'dataChoosed'値をtryparseしています。なぜなら、それはテキストボックスから来ており、整数が必要だからです。 SQLインジェクションを防ぐのに十分なのはtryparseですか?

+10

パラメータを使用する必要があります。 SQLとパラメータを連結しても問題ありません。 – SLaks

+6

常にパラメータを使用してください。[ベストプラクティス - SQL文の実行](http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements)を参照してください。とhows。 – Igor

+2

"選択"の過去の分詞は "選択"され、 "選択"されません。変数名に正しいスペルがある場合、他の人がコードを見やすくする:) –

答えて

-2

[BLANK]はSQLインジェクションから保護しますか?

[BLANK]が「パラメータ」でない限り、答えは常に「いいえ」です。

+0

Down votes?どうして? – aquinas

+1

Dunno。私ではありませんでした。おそらく、それはあまりにも簡潔で、 '[BLANK]'は「ある程度新しいアイデアについての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

オペレータが言及した整数値にVarCharカラムを使用していれば問題ありません。実際にVarChar型の場合は、長さをデータベースの宣言と同じにする方がよいでしょう。 [ベストプラクティス - SQL文の実行](http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements#t=201703162000398457387)に詳しい情報があります。イゴールのコメントにリンクされているように)。 –

1

いいえ、あなたは安全側にないです。

// 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"; 

そして、災い:dataChoosedは無実整数値であっても、不良少年は、たとえば、と負の値の形式をあなたを傷つけることができます!私のテーブルはどこですか? 、

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

(私は--1'GROUP BY xxxフラグメントをコメントアウトを削除しました)

してください、使用パラメータ:コマンドテキストはefficently クエリで

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

になります私たちを誘惑しないでください。コードを変更したくないということに気をつけてください:Windowsのの国の設定を変更するだけです。

関連する問題