次の方法で共有


セキュリティ (LINQ to DataSet)

このトピックでは、LINQ to DataSet におけるセキュリティの問題について説明します。

信頼できないコンポーネントへのクエリの受け渡し

LINQ to DataSet のクエリは、プログラム内の 1 か所で作成し、別の場所でそれを実行できます。 このクエリは、それが定義されている場所から見えるすべての要素、たとえば、呼び出し元のメソッドが所属しているクラスのプライベート メンバーやローカル変数/引数を表すシンボルなどを参照できます。 実行時には、呼び出し元のコードから見えなくても、クエリの定義時に参照されたメンバーであれば、事実上アクセスできることになります。 クエリを実行するコードが、任意に見える要素を増やすことはできません。つまり、アクセスできる範囲を実行元のコードそのものが決めることはできません。 アクセスの範囲は、クエリがアクセスできる範囲に限定されており、そのクエリ自体を通してのみアクセスできます。

つまり、クエリへの参照をコードの別の部分に渡した場合、そのクエリを受け取ったコンポーネントが信頼され、パブリックであるか、プライベートであるかに関係なく、クエリによって参照されたすべてのメンバーに対するアクセスが許可されます。 クエリが慎重に作成され、機密情報が決して漏洩しないという確信がない限り、通常は LINQ to DataSet のクエリを信頼できないコンポーネントに渡さないでください。

外部入力

アプリケーションによっては (ユーザーや他の外部エージェントからの) 外部入力を受け取り、その入力内容に応じた処理を実行する場合があります。 LINQ to DataSet の場合、アプリケーションでは、外部入力を基にして特定の方法でクエリが構築されるか、またはクエリで外部入力が使用される場合があります。 LINQ to DataSet のクエリでは、リテラルを渡すことのできる場所であればどこででもパラメーターを渡すことができます。 アプリケーションの開発者は、外部エージェントから受け取ったリテラルを直接クエリに挿入することは避け、パラメーター化クエリを使用するようにしてください。

直接、間接を問わず、ユーザーまたは外部エージェントから受け取った入力には、対象言語の構文を巧みに利用して不正なアクションを実行する内容が含まれている可能性があります。 これは、対象言語が Transact-SQL である場合、その攻撃パターンにちなんで SQL インジェクション攻撃と呼ばれます。 クエリに直接挿入されるユーザー入力を使用して、データベースのテーブルを削除したり、サービス拒否の状態を引き起こしたり、本来実行される操作を改変したりします。 LINQ to DataSet 内でクエリを構築することは可能ですが、オブジェクト モデルの API を介して構築します。 Transact-SQL とは異なり、LINQ to DataSet のクエリは、文字列の操作や連結を使用して構築されることはなく、従来のように SQL インジェクション攻撃を受けることはありません。

関連項目