ダッパーとSQLインジェクション

.net .net-3.5 dapper orm

質問

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<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処理
  • 結果列のnull処理
  • 順序列インデックスを使用して
  • 基礎となるテーブルと型の構造的な変更に適応する
  • 結果列のデータ変換(さまざまなプリミティブ、文字列、列挙型など)
  • あまりにも一般的な "このリストで"シナリオの特別な処理
  • "実行する"のために、 "これを別々に入力リストに適用する"
  • 愚かなタイプミスを避ける
  • コード保守の削減
  • 複数のグリッドを扱う
  • 単一のグリッド内で水平に返された複数のオブジェクトの処理
  • 任意のADO.NETプロバイダーで作業する(ヒント: AddWithValueほとんど存在しません)
    • Oracleなどの追加の構成が必要なものの特定のサポートを含む
    • "ミニプロファイラー"のようなADO.NETのdecoratosでうまく演奏します。
  • バッファされた(小から中程度のデータに適し、コマンドの持続時間を最小限に抑える)バッファリングされていない(大容量データに最適、メモリ使用量が最小限に抑えられている)アクセス
  • パフォーマンスを気にし、データアクセスとメタプログラミングの両方について「かなり」知っている人々によって最適化されています
  • パラメータと出力の両方にPOCO / DTO / anon-type / whateverを選択できます
  • 出力がPOCO / DTOの生成を正当化しない場合(単一列の場合)、 dynamic (マルチカラムの場合)またはプリミティブなどの使用を許可します
  • 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によって絶対的にサポートされています。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ