44

Dapper は SQL インジェクションからの保護にどのように役立ちますか? さまざまな DAL テクノロジをテストしており、サイトを安全にするために 1 つを選択する必要があります。私は Dapper (http://code.google.com/p/dapper-dot-net/) に傾倒していますが、セキュリティについて学習するための助けが必要です。

4

2 に答える 2

56

Dapper は SQL インジェクションからの保護にどのように役立ちますか?

入力を連結する必要なく、完全にパラメータ化されたデータアクセスを非常に簡単に行うことができます。特に、多くの「パラメーターの追加、パラメーターの型の設定、ADO.NET には吸う null 処理があるため null のチェック、20 個のパラメーターのすすぎ/繰り返し」をジャンプする必要がないため、パラメーター処理を非常に便利にすることで. また、行をオブジェクトに変換するのが非常に簡単になり、使用する誘惑を回避できますDataTable...誰もが勝ちます。

コメントから:

もう1つ... dapperは実際に何をするのに役立ちますか?

答えるために、marc_s の返信から例を取り、古い方法で書きましょうconnection。これは次のとおりです。

List<Dog> dogs = new List<Dog>();
using(var cmd = connection.CreateCommand()) {
    cmd.CommandText = "select Age = @Age, Id = @Id";
    cmd.Parameters.AddWithValue("Age", DBNull.Value);
    cmd.Parameters.AddWithValue("Id", guid);
    using(var reader = cmd.ExecuteReader()) {
        while(reader.Read()) {
            int age = reader.ReadInt32("Age");
            int id = reader.ReadInt32("Id");
            dogs.Add(new Dog { Age = age, Id = id });
        }
        while(reader.NextResult()) {}
    }
}

ただし、次のような幅広い問題も扱っているため、大幅に単純化しすぎています。

  • パラメータの null 処理
  • 結果列のヌル処理
  • 序数の列インデックスを使用する
  • 基になるテーブルと型の構造変更への適応
  • 結果列のデータ変換 (さまざまなプリミティブ、文字列、列挙などの間)
  • 非常に一般的な「このリスト内」シナリオの特別な処理
  • 「実行」の場合、「これを入力のリストに個別に適用」の特別な処理
  • ばかげたタイプミスを避ける
  • コードのメンテナンスを減らす
  • 複数のグリッドの処理
  • 単一のグリッドで水平方向に返される複数のオブジェクトの処理
  • 任意の ADO.NET プロバイダーとの連携 (ヒント:AddWithValueほとんど存在しません)
    • 追加の構成が必要な Oracle などの特定のサポートを含む
    • 「ミニプロファイラー」などの ADO.NET デコレータとうまく連携
  • バッファ付き (小規模から中程度のデータに適し、コマンド実行時間を最小限に抑える) および非バッファ型 (大きなデータに適し、メモリ使用量を最小限に抑える) アクセスの組み込みサポート
  • パフォーマンスを気にし、データアクセスとメタプログラミングの両方について「かなり」知っている人々によって最適化されています
  • パラメータと出力の両方に、POCO / DTO / anon-type / なんでも選択して使用できます
  • dynamic出力がPOCO / DTOの生成を保証しない場合、(複数列の場合)またはプリミティブなど(単一列の場合)の使用を許可します
  • EF のような完全に型指定された複雑な ORM のオーバーヘッドを回避する
  • 次のような弱い型付けされたレイヤーのオーバーヘッドを回避しますDataTable
  • 必要に応じて接続を開閉する
  • およびその他の一般的な落とし穴の広大な範囲
于 2012-12-01T22:42:03.010 に答える
44

いつものようにパラメータ化されたクエリを使用するだけです。Dapper は「生の」SQL および ADO.NET に対する「小さな」(そしてかなり薄い) 拡張であるため、パラメータ化された ADO.NET クエリを使用してパラメータを指定するだけです。

Dapper-Dot-Net サイトのこのサンプルを参照してください。

var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", 
                                new { Age = (int?)null, Id = guid });

SQL クエリはパラメータを使用し、それらを「Dapper」クエリに提供します。

要約すると、Dapper を使用すること自体は、SQL インジェクション自体から保護するのに役立ちません - ただし、パラメータ化された ADO.NET/SQL クエリを使用することはできます (これらのクエリは Dapper によって完全にサポートされており、まったく問題はありません)。

于 2012-11-30T21:30:53.130 に答える