Dapper は SQL インジェクションからの保護にどのように役立ちますか? さまざまな DAL テクノロジをテストしており、サイトを安全にするために 1 つを選択する必要があります。私は Dapper (http://code.google.com/p/dapper-dot-net/) に傾倒していますが、セキュリティについて学習するための助けが必要です。
2 に答える
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
- 必要に応じて接続を開閉する
- およびその他の一般的な落とし穴の広大な範囲
いつものようにパラメータ化されたクエリを使用するだけです。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 によって完全にサポートされており、まったく問題はありません)。