web-dev-qa-db-ja.com

動的LINQを介してインジェクションは可能ですか?

動的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-sqllinq-to-entitiesの両方に当てはまると考えることができます(Entity Frameworkへの上記の参照にもかかわらず)。

42
Seph

まあ、私は動的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(または任意のバックエンド)に依存します。

31
Krizz

System.Data.Linq名前空間は、SQLオブジェクトツリーがLINQクエリから構築され、このプロセスの一部として、すべてのインライン値をパラメーターに置き換えるためにSqlParameterizerクラスが呼び出されます。次に、値がパラメーターに割り当てられます。したがって、SQLインジェクション攻撃は不可能であるべきです。

3