2016-09-07 18 views
5

私は関連するフィルタを適用しているIQueryableをビルドしています。このコードはここにあります。Entity Framework + SQLインジェクション

items = items.OrderBy(string.Format("{0} {1}", sortBy, sortDirection)); 

このスニペットはSQLインジェクションに対して脆弱ですか?または、これらの(文字列)パラメータがシーンの裏でパラメータ化されていますか?私はすべてのLinqクエリがエスケープされ、私のためにパラメータ化されていると仮定しましたが、実際にこのような文字列を渡すことができるという事実は私を捨ててしまいます。

+0

があなたのためにその文の仕事をしていますか?静的な拡張メソッドを実装していますか?私は 'OrderBy'に慣れていないので、lamba式を取っていません。 – sgeddes

+0

この拡張は、 'System.Linq.Dynamic'名前空間にあります。 メソッドシグニチャ 'static IQueryable OrderBy (このIQueryable ソース、文字列の順序、paramsオブジェクトの[]値)を使用します。 – alexhuang

+1

System.Linq.Dynamicは、CodePlexでホストされているオープンソースプロジェクトのようです。ソースコードはhttp://dynamiclinq.codeplex.com/SourceControl/latest#DynamicLinq/System.Linq.Dynamic/Dynamic.csにあります。私が見ることのできるところからは、文字列データを取得してそれを使って式ツリーを修正しています。いいえ、SQLインジェクションには脆弱ではありません。 –

答えて

12

最初のポイント:

  • クエリの消費者:あなたは次のような理由で、潜在的に信頼できない発信者に公開されるメソッドからIQueryable<T>型を返す避けるために持っている

IQueryable<T>型を公開すると、結果として メソッドが呼び出され、セキュリティ保護されたデータが公開されるか、または 結果セット。 は例えば、は、以下のメソッドシグネチャを考えてみます。

public IQueryable<Customer> GetCustomer(int customerId)

このクエリの消費者が、クエリを公開するつもりはなかったというデータを取得するために戻っIQueryable<Customer>.Include("Orders")を呼び出すことができます。これは、メソッドの戻り値の型をIEnumerable<T>に変更し、結果を具体化するメソッド(.ToList()など)を呼び出すことで回避できます。

  • 結果は を繰り返し処理しているときIQueryable<T>クエリが実行されるため、IQueryable<T> タイプを公開するクエリの消費者がスローされた例外をキャッチすることができます。 Exceptionsには、消費者向けではない情報 が含まれている可能性があります。

第二の点:SQLインジェクション攻撃を防ぐためにどのように

  • エンティティSQLインジェクション攻撃:

SQLインジェクション攻撃はquery predicateおよびparameter namesに使用される値にmalicious inputを供給することにより、エンティティSQLで行うことができます。

SQLインジェクションのリスクを避けるために

エンティティSQLはaccept parametersどこでもリテラルが受け入れられることを照会しますが、エンティティのSQLコマンドテキストでユーザーの入力を結合することはありません

リテラルを外部エージェントからクエリに直接注入するのではなく、パラメータ化されたクエリを使用する必要があります。また、照会ビルダーのメソッドを使用してEntity SQLを安全に構築するには、も考慮する必要があります。

  • エンティティインジェクション攻撃へのLINQクエリ組成物はエンティティへのLINQで可能ですが

、それはオブジェクトモデルAPIを介して行われます。 Entity SQLクエリとは異なり、LINQ to Entitiesクエリは文字列操作または連結を使用して作成されず、従来のSQLインジェクション攻撃の影響を受けません。

参考:Security Considerations (Entity Framework)

関連する問題