2015-10-01 26 views
7

linqをSQLに使用すると、すべてがパラメータ化され、SQLインジェクションセーフであることがわかります。 しかし、IQueryableはどうですか?例えばEntity Frameworkを使用したIQueryable SQLインジェクション証明はありますか?

、私はIQueryableをするためにいくつかのエンティティをキャストすることができます

var myquery = mytesttable.AsQueryable(); 
var qText = "name="+ "\""+DynamicSearchCondition+ "\""; 
myquery = myquery.Where(qText); 

その後、クエリが実行されたときに、トレースから私は、渡されたDynamicSearchConditionがparametrisedされていないことがわかります。

私はこれがSQLインジェクションプルーフではないと思っていましたが、いくつかの例を試してみましたが、これを破ることはできません。 SQLインジェクションが無料であることを意味しますか(今はそうだと思いますか?)

これが真であれば、IQueryableはすべてSQLインジェクションに対して安全ですか?

+0

私は、その安全はこのブログのhttp 'を参照してくださいとは思いません。com/b/publicsector/archive/2008/08/21/prevent-sql-injection-the-entity-framework-and-data-services.aspx' –

+0

正しいリンクは:http://blogs.msdn.com /b/publicsector/archive/2008/08/21/preventing-sql-injection-with-theentity-framework-and-data-services.aspx –

+0

ここで '_'を引数_string_で取得しますか? – Grundy

答えて

0

いいえ、IQueryableは、クエリExpressionを作成するための単なるインターフェイスであるため、それ自体は注入の証拠ではありません。それはどのようにExpressionを取って、SQLのような実行されるべきものにするかを定義しません。 は何ですかはこれを実行しますProvider(多くは存在しますが、オブジェクトにはLinq、EntityにはLinq、ExcelにはLinq)。

DynamicLinq(.Where(string)拡張の使用に基づく)を使用しているあなたの例では、通常のLinqと同様のパラメータ化保護をエンティティIQueryableのものとする必要があります。 DynamicLinqは、IQueryableの上で動作するユーティリティなので、追加のSQL注入問題を導入しません。実際には、実際にSQLに変換するためにはProviderに依存している表現ツリーに変換されます。これは、DynamicLinq構文自体が独自の注入ポテンシャルから安全であることを意味するものではありません(hereの例を参照してください)。ではなく、 SQL注入です。

マイクロソフトでは、このエンティティとSQLインジェクションにLINQについて言いたいことがあります。クエリ組成物はエンティティへのLINQで可能です

Security Considerations (Entity Framework)

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

これは、DynamicLinqで構築されたIQueryable(プロバイダとしてLINQを使用する場合)が入力をパラメータ化する必要があることを意味します。あなたの質問が本当に「LINQ to Entities injection proofですか?」と答えると、「おそらく彼らはそれを守るためにすべての合理的な努力をしました。

+0

DynamicLinq **では追加のSQLインジェクションに関する懸念がありますこれは文字列操作や連結を使用して作成されるため、従来のSQLインジェクション攻撃の影響を受けやすい**です。 –

+0

いいえ、私はSQLインジェクションとDynamicLinqインジェクションの違いの例を含めました。あなたの主張を裏付ける例を教えてください。 – Ocelot20

+0

上記の回答を見るか、私が示した重複した回答を見てください。 –

2

これは絶対に注入攻撃に弱いです。あなたの特定の例

var myquery = mytesttable.AsQueryable(); 
var qText = "name="+ "\""+DynamicSearchCondition+ "\""; 
myquery = myquery.Where(qText); 

はこれで失敗します://blogs.msdn:

var DynamicSearchCondition= "\" or \"\"=\""; 
+0

技術的には、これはSQLインジェクションではなく、DynamicLinq述部インジェクション攻撃であると主張できますが、「ルックアンドフィール」は同じで、同様の懸念があります。 DynamicLinqの構文は基本的にSQL(またはSQLの独自のもの)なので、まだSQLインジェクションであると主張することもできます。ただ、式ツリーに変換された後、SQLに再び戻ってくるものです。 –

+0

どちらの場合でも、どのように見ても、より一般的な注入攻撃の影響を受けます。 –

+0

これらは同様の懸念事項であり、絶対に考慮する必要がありますが、質問はSQLインジェクションに関するもので、クエリのパラメータ化を参照しています。 – Ocelot20

関連する問題