質問: 動的LINQライブラリ( リンク )を使用すると、インジェクションに対して脆弱ですか?そして(もしそうなら)これをどのように防ぐことができますか? セキュリティに関する考慮事項(Entity Framework)の背景: > LINQ to Entitiesインジェクション攻撃: > > クエリの構成はLINQ to Entitiesで可能ですが、オブジェクトモデルAPIを介して実行されます。 Entity SQLクエリとは異なり、LINQ to Entitiesクエリは、文字列操作または連結を使用して構成されていないため、従来のSQLインジェクション攻撃の影響を受けません。 > > ダイナミックSQLは文字列を使用して構成されているため、インジェクションベクターの影響を受けやすい可能性があるということですか。または、LINQ to SQLは、動的LINQライブラリ内の基になるデータ型に基づいて、値のパラメーター化を自動的に処理しますか? または、動的クエリはSQLに対してではなくメモリ内で実行されるため、完全に安全ですか(それによってSQLインデックスのメリットがすべて失われます)。 私は`DynamicLibrary.cs`コードの理解に取り組んできましたが、何かを見落としている可能性があると確信しています。 この質問は動的LINQライブラリ自体に関するものなので、この質問は`linq-to-sql`と`linq-to-entities`両方に当てはまると見なすことができます(Entity Frameworkを参照しているにもかかわらず)。
回答: まあ、私は動的Linqではインジェクションが不可能であることに同意しません。 Æ‰iamond Ç¤eezeÆ¦の 回答に記載されている内容は正しいですが、C#またはVB.Netで、または.Whereなどの拡張メソッドをラムダ関数で呼び出すことにより、特定の言語内で構築された標準のLinqに`.Where`ます。 それから、もちろん、.NET LinqからSqlへのトランスレータはきちんと書かれているので、何も注入することはできません。したがって、「SQLインジェクション」は不可能です。 ただし、Dynamic Linqで可能なのは「Linqインジェクション」攻撃です。 OPが引用するlinqの安全性の説明では、次のように述べられています。 > LINQ to Entitiesクエリは、文字列操作または連結を使用して構成されていないため、従来のSQLインジェクション攻撃の影響を受けません。 > > そして、基本的にこれは要点です。クエリが文字列操作で構成されている場合、インジェクション攻撃を受ける傾向があります。また、Dynamic Linqは実際には文字列で構成されているため、インジェクションによって攻撃される可能性があります。 明らかに、攻撃者は、DynamicLinqを使用していることを認識している必要があり、データを準備するだけで攻撃できるため、有効な悪意のある動的Linqクエリが発生します。 この事実を強調したいのですが、最終的な**SQL**は**安全**に構成されてい**ます**が、元の**動的Linq**が安全かどうかは**ユーザー** **次第です** 。 動的linqクエリを安全にするには、すべての**ユーザー入力に** **プレースホルダー**を使用する**必要があります** 。文字列を連結しないでください! 次のクエリを想像してください: ``` dataset.Where("allowed == 1 and code == \"" + user_entered_data + "\""); ``` 入力がサニタイズおよびエスケープされていない場合、攻撃者は次のように入力する可能性があります。 ``` 200" or allowed == 0 and code == "200 ``` その結果: ``` allowed == 1 and code == "200" or allowed == 0 and code == "200" ``` これを回避するには、プレースホルダーを使用する必要があります。 ``` dataset.Where("allowed == 1 and code == @0", user_entered_data); ``` DynamicLinqは、プレースホルダー(この場合はユーザーが入力したデータ)をラムダ引数にして(クエリに連結するのではなく)、安全にSQLに変換するためにLinq-To-Entities(または任意のバックエンド)に依存します。