依存関係プロパティのセキュリティ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. ただし、ラッパーは、依存関係プロパティを操作するときGetValueSetValue使用される、基になる呼び出しと静的呼び出しを実装する便利なメソッドにすぎません。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識別子フィールド private の宣言は禁止されていないため、カスタムクラスのすぐに公開される名前空間を減らすために使用される場合がありますが、このようなプロパティは、共通言語と同じ意味で "プライベート" と見なされないようにする必要があります。ランタイム (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 public 以外のアクセスレベルとして宣言することは誤解される可能性があります。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