動的LINQライブラリ( link )を使用すると、インジェクションに対して脆弱ですか?そして(もしそうなら)これをどのように防ぐことができますか?
セキュリティの考慮事項(エンティティフレームワーク) からの背景:
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ではインジェクションが不可能であることに同意しません。
answerƉiamondǤeezeƦ による記述は正しいが、特定の言語-C#またはVB.Net内で構築されるか、.Where
ラムダ関数付き。
それから、もちろん、.NET LinqからSqlへのトランスレータはきちんと書かれているため、何も注入することはできません。したがって、「SQLインジェクション」は不可能です。
ただし、Dynamic Linqで可能なことは「Linqインジェクション」攻撃です。 OPが引用するlinqの安全性の説明では、次のように述べられています。
LINQ to Entitiesクエリは、文字列操作や連結を使用して構成されていないため、従来のSQLインジェクション攻撃の影響を受けません。
そして、これは基本的に要点です。クエリが文字列操作で構成されている場合、インジェクション攻撃を受ける傾向があります。また、Dynamic Linqは実際には文字列で構成されているため、インジェクションによって攻撃される可能性があります。
明らかに、攻撃者はDynamicLinqを使用していることを認識している必要があり、データを準備するだけで攻撃できるため、有効な悪意のある動的Linqクエリが発生します。
この事実を強調したい-最後の[〜#〜] sql [〜#〜]は安全に構成されているが、オリジナル動的Linqは安全ですはあなたに依存します。
動的linqクエリを安全にするには、すべてのユーザー入力にplaceholdersを使用する必要があります。文字列を連結しないでください!
次のクエリを想像してみてください:
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(または任意のバックエンド)に依存します。
System.Data.Linq
名前空間は、SQLオブジェクトツリーがLINQクエリから構築され、このプロセスの一部として、すべてのインライン値をパラメーターに置き換えるためにSqlParameterizer
クラスが呼び出されます。次に、値がパラメーターに割り当てられます。したがって、SQLインジェクション攻撃は不可能であるべきです。