依存関係プロパティのセキュリティDependency Property Security

依存関係プロパティは、一般に、パブリック プロパティと考える必要があります。Dependency properties should generally be considered to be public properties. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) のプロパティ システムの性質のため、依存関係プロパティの値に関してセキュリティを保証することはできません。The nature of the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) property system prevents the ability to make security guarantees about a dependency property value.

ラッパーと依存関係プロパティのアクセスとセキュリティAccess and Security of Wrappers and Dependency Properties

通常、依存関係プロパティは、インスタンスからのプロパティの取得または設定を簡素化する "ラッパー" 共通言語ランタイム (CLR) プロパティと共に実装されます。Typically, dependency properties are implemented along with "wrapper" common language runtime (CLR) properties that simplify getting or setting the property from an instance. ただし、ラッパーは実際には、依存関係プロパティとの対話時に使われる下位レベルの GetValue および SetValue の静的な呼び出しを実装する簡易メソッドにすぎません。But the wrappers are really just convenience methods that implement the underlying GetValue and SetValue static calls that are used when interacting with dependency properties. 別の考え方をすれば、プロパティは、プライベート フィールドではなくたまたま依存関係プロパティが基になっている共通言語ランタイム (CLR) プロパティとして公開されます。Thinking of it in another way, the properties are exposed as common language runtime (CLR) properties that happen to be backed by a dependency property rather than by a private field. ラッパーに適用されるセキュリティ メカニズムでは、プロパティ システムの動作と基になっている依存関係プロパティのアクセスは並列化されません。Security mechanisms applied to the wrappers do not parallel the property system behavior and access of the underlying dependency property. ラッパーにセキュリティを要求すると、簡易メソッドの使用が防がれるだけで、GetValue または SetValue の呼び出しを防ぐことはできません。Placing a security demand on the wrapper will only prevent the usage of the convenience method but will not prevent calls to GetValue or SetValue. 同様に、保護されたアクセス レベルまたはプライベート アクセス レベルをラッパーに適用しても、効果的なセキュリティは提供されません。Similarly, placing protected or private access level on the wrappers does not provide any effective security.

依存関係プロパティを独自に作成する場合は、呼び出し元がそのプロパティの真のアクセス レベルについて誤解しないように、ラッパーと DependencyProperty 識別子フィールドをパブリック メンバーとして宣言する必要があります (そのストアが依存関係プロパティとして実装されているため)。If you are writing your own dependency properties, you should declare the wrappers and the DependencyProperty identifier field as public members, so that callers do not get misleading information about the true access level of that property (because of its store being implemented as a dependency property).

カスタム依存関係プロパティの場合は、プロパティを読み取り専用の依存関係プロパティとして登録できます。そうすることで、そのプロパティの DependencyPropertyKey に対する参照を保持しないでプロパティを設定するのを防ぐ、有効な手段になります。For a custom dependency property, you can register your property as a read-only dependency property, and this does provide an effective means of preventing a property being set by anyone that does not hold a reference to the DependencyPropertyKey for that property. 詳細については、「読み取り専用の依存関係プロパティ」を参照してください。For more information, see Read-Only Dependency Properties.

注意

DependencyProperty 識別子フィールドをプライベートとして宣言することは禁止されておらず、カスタム クラスのすぐに公開される名前空間を減らすのに役立つ場合があるかもしれませんが、次のセクションで説明するように共通言語ランタイム (CLR) 言語の定義でそのアクセス レベルが定義されているのと同じ意味で、そのようなプロパティを "プライベート" と考えるべきではありません。Declaring a DependencyProperty identifier field private is not forbidden, and it can conceivably be used to help reduce the immediately exposed namespace of a custom class, but such a property should not be considered "private" in the same sense as the common language runtime (CLR) language definitions define that access level, for reasons described in the next section.

プロパティ システムによる依存関係プロパティの公開Property System Exposure of Dependency Properties

DependencyProperty をパブリック以外のアクセス レベルとして宣言することは、一般に意味のないことであり、誤解を招くおそれがあります。It is not generally useful, and it is potentially misleading, to declare a DependencyProperty as any access level other than public. このようなアクセス レベルの設定は、宣言しているクラスからインスタンスへの参照を取得できるのを防ぐだけです。That access level setting only prevents someone from being able to get a reference to the instance from the declaring class. しかし、特定のプロパティがクラスまたは派生クラスのインスタンスに存在することを示す手段としてプロパティ システムが DependencyProperty を返すことには複数の側面があり、元の静的識別子が非パブリックと宣言されている場合であっても、この識別子を SetValue の呼び出しで使用できます。But there are several aspects of the property system that will return a DependencyProperty as the means of identifying a particular property as it exists on an instance of a class or a derived class instance, and this identifier is still usable in a SetValue call even if the original static identifier is declared as nonpublic. また、OnPropertyChanged 仮想メソッドは、値が変化した既存の依存関係プロパティの情報を受け取ります。Also, OnPropertyChanged virtual methods receive information of any existing dependency property that changed value. さらに、GetLocalValueEnumerator メソッドは、値がローカルに設定されたインスタンスのプロパティに対する識別子を返します。In addition, the GetLocalValueEnumerator method returns identifiers for any property on instances with a locally set value.

検証とセキュリティValidation and Security

ValidateValueCallback に対して要求を適用し、要求の失敗で検証エラーになってプロパティが設定されないことを期待するのは、適切なセキュリティ メカニズムではありません。Applying a demand to a ValidateValueCallback and expecting the validation failure on a demand failure to prevent a property from being set is not an adequate security mechanism. 悪意のある呼び出し元がアプリケーション ドメイン内で動作している場合、ValidateValueCallback によって適用される値設定の無効化も、そのような呼び出し元によって抑制される可能性があります。Set-value invalidation enforced through ValidateValueCallback could also be suppressed by malicious callers, if those callers are operating within the application domain.

関連項目See also