ASP.NET

C# .NET パラメータクエリでSQLインクジェクション対策

画面から受け取るパラメータを

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です。

おしまい。

-ASP.NET