画面から受け取るパラメータを
public DataTable Hoge(string hogehoge)
{
string sql;
NpgsqlCommand cmd = this.DataService.CreateCommand();
cmd.CommandType = CommandType.Text;
sql = "select * from table_a";
// ↓↓↓ここ
sql = sql + " where hoge like '%" + hogehoge + "%'";
こんな風にwhere句に渡すと、SQLインクジェクションにやられちゃうらしい。
実際、hogehogeパラメータに以下を渡してみたら
' and cast( (select pg_sleep(10)) as varchar) ='
cmd.CommandText = sql;
DataTable datatable;
// ここで 10秒止まる。
datatable = this.DataService.ExecuteSelectCommand(cmd);
return datatable;
}
実行時に10秒止まった。
普段、パラメータクエリを使用しているのですが、開発中のシステムで上記の部分だけ、なんかそうなってました。
パラメータクエリ使うと、SQLインクジェクション対策になるらしいデス。知らないで使っていました。
Javaとかだとプリペアドステートメントとかいうらしい。ほんと?
セキュアなコーディングを心がけないとです。
パラメータクエリ
NpgsqlCommand.Parameters.Add
↑ これ、LIKEなレコードは拾ってくれないので
部分検索は、こちらを使います。
NpgsqlCommand.Parameters.AddWithValue
修正後のプログラム
public DataTable Hoge(string hogehoge)
{
string sql;
NpgsqlCommand cmd = this.DataService.CreateCommand();
cmd.CommandType = CommandType.Text;
sql = "select * from table_a";
// 修正
sql = sql + " where hoge like @hogehoge";
// 追加
cmd.Parameters.AddWithValue ("@hoge", "%" + hogehoge + "%");
cmd.CommandText = sql;
DataTable datatable;
datatable = this.DataService.ExecuteSelectCommand(cmd);
return datatable;
}
修正後
' and cast( (select pg_sleep(10)) as varchar) ='
これ投げても、とまらなくなりました。
ちなみに、DBはPostgreSQLです。
おしまい。