画面から受け取るパラメータを
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です。
おしまい。