いいえ、あなたは安全側にないです。
// 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のの国の設定を変更するだけです。
パラメータを使用する必要があります。 SQLとパラメータを連結しても問題ありません。 – SLaks
常にパラメータを使用してください。[ベストプラクティス - SQL文の実行](http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements)を参照してください。とhows。 – Igor
"選択"の過去の分詞は "選択"され、 "選択"されません。変数名に正しいスペルがある場合、他の人がコードを見やすくする:) –