依存関係プロパティのセキュリティ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. ラッパーにセキュリティ確認要求を配置すると、便利なメソッドの使用は妨げられるだけですが、 またはGetValueSetValueの呼び出しは行いません。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).

カスタム依存関係プロパティの場合、プロパティを読み取り専用の依存関係プロパティとして登録できますDependencyPropertyKeyFor 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) 言語定義と同じ意味で、このようなプロパティを "private" と見なすべきではありません。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

要求を a に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