質問: DapperはどのようにしてSQLインジェクションから保護しますか?私はさまざまなDAL技術をテストしており、私たちのサイトを安全にするために1つを選択する必要があります。私はDapper(http://code.google.com/p/dapper-dot-net/)に傾いていますが、セキュリティについて学ぶための助けが必要です。
回答: > DapperはどのようにしてSQLインジェクションから保護しますか? > > 入力を連結することなく、完全にパラメータ化されたデータアクセスを行うのは**本当に**簡単です。特に、 *ADO.NETはヌル処理が面倒で* 、20個のパラメータをリンス/リピートする*ので* 、パラメータのタイプを設定し、パラメータのタイプを設定して、ヌルをチェックする必要はないので、パラメータ処理を**愚かに**便利にする。また、行をオブジェクトに簡単に変換して、 `DataTable`を使用する誘惑を避け`DataTable` ...誰もが勝ちます。 コメントから: > もう1つ...ダッパーが実際に何をしてくれるのですか? > > 答えるために、我々はで開始する必要があり、すべてがあると仮定すると、古い方法をmarc_sの回答から例を取り、それを書いてみましょう`connection` 。これは次のようになります。 ``` List dogs = new List(); 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処理 * 結果列のnull処理 * 順序列インデックスを使用して * 基礎となるテーブルと型の構造的な変更に適応する * 結果列のデータ変換(さまざまなプリミティブ、文字列、列挙型など) * あまりにも一般的な "このリストで"シナリオの特別な処理 * "実行する"のために、 "これを別々に入力リストに適用する" * 愚かなタイプミスを避ける * コード保守の削減 * 複数のグリッドを扱う * 単一のグリッド内で水平に返された複数のオブジェクトの処理 * 任意のADO.NETプロバイダーで作業する(ヒント: `AddWithValue`ほとんど存在しません) + Oracleなどの追加の構成が必要なものの特定のサポートを含む + "ミニプロファイラー"のようなADO.NETのdecoratosでうまく演奏します。 * バッファされた(小から中程度のデータに適し、コマンドの持続時間を最小限に抑える)バッファリングされていない(大容量データに最適、メモリ使用量が最小限に抑えられている)アクセス * パフォーマンスを気にし、データアクセスとメタプログラミングの両方について「かなり」知っている人々によって最適化されています * パラメータと出力の両方にPOCO / DTO / anon-type / whateverを選択できます * 出力がPOCO / DTOの生成を正当化しない場合(単一列の場合)、 `dynamic` (マルチカラムの場合)またはプリミティブなどの使用を許可します * EFのような複雑な完全型のORMのオーバーヘッドを避ける * `DataTable`ような弱い型のオーバーヘッドを避ける * 必要に応じて開閉接続 * と広範囲の他の一般的な落書き