Segurança de propriedade da dependênciaDependency Property Security

As propriedades da dependência geralmente devem ser consideradas como propriedades públicas.Dependency properties should generally be considered to be public properties. A natureza do sistema de propriedades Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) impede que a capacidade de dar garantias de segurança sobre um valor da propriedade de dependência.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.

Acesso e segurança de Wrappers e propriedades de dependênciaAccess and Security of Wrappers and Dependency Properties

Normalmente, as propriedades de dependência são implementadas juntamente com propriedades de tempo de execução de linguagem comum (CLR) que simplificam a obtenção ou configuração da propriedade a partir de uma instância.Typically, dependency properties are implemented along with "wrapper" common language runtime (CLR) properties that simplify getting or setting the property from an instance. Mas os invólucros são realmente apenas GetValue SetValue métodos de conveniência que implementam as chamadas subjacentes e estáticas que são usadas ao interagir com propriedades de dependência.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. Pensando nisso de outra forma, as propriedades são expostas como propriedades comuns de tempo de execução (CLR) que por acaso são apoiadas por uma propriedade de dependência e não por um campo privado.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. Mecanismos de segurança aplicados aos wrappers não são paralelo ao comportamento do sistema de propriedade e acesso da propriedade de dependência subjacente.Security mechanisms applied to the wrappers do not parallel the property system behavior and access of the underlying dependency property. Colocar uma demanda de segurança no invólucro só impedirá o GetValue SetValueuso do método de conveniência, mas não impedirá chamadas ou .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. Da mesma forma, impor um nível de acesso protegido ou privado aos wrappers não oferece nenhuma segurança efetiva.Similarly, placing protected or private access level on the wrappers does not provide any effective security.

Se você está escrevendo suas próprias propriedades de dependência, DependencyProperty você deve declarar os invólucros e o campo identificador como membros públicos, para que os chamadores não obtenham informações enganosas sobre o verdadeiro nível de acesso dessa propriedade (devido à sua loja ser implementada como uma propriedade de dependência).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).

Para uma propriedade de dependência personalizada, você pode registrar sua propriedade como uma propriedade de dependência somente leitura, e isso fornece um DependencyPropertyKey meio eficaz de impedir que um imóvel seja definido por qualquer pessoa que não tenha uma referência à propriedade.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. Para obter mais informações, consulte Propriedades de dependência somente leitura.For more information, see Read-Only Dependency Properties.

Observação

Declarar um DependencyProperty campo identificador privado não é proibido, e pode ser usado para ajudar a reduzir o espaço de nome imediatamente exposto de uma classe personalizada, mas tal propriedade não deve ser considerada "privada" no mesmo sentido que as definições de linguagem comum (CLR) definem esse nível de acesso, por razões descritas na próxima seção.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.

Exposição do sistema de propriedades das propriedades de dependênciaProperty System Exposure of Dependency Properties

Não é geralmente útil, e é potencialmente DependencyProperty enganoso, declarar um como qualquer nível de acesso que não seja público.It is not generally useful, and it is potentially misleading, to declare a DependencyProperty as any access level other than public. Essa configuração de nível de acesso só impede que alguém possa obter uma referência à instância da classe declarante.That access level setting only prevents someone from being able to get a reference to the instance from the declaring class. Mas há vários aspectos do sistema de DependencyProperty propriedade que retornarão a como meio de identificar uma propriedade específica como ela existe em uma instância SetValue de uma classe ou uma instância de classe derivada, e este identificador ainda é utilizável em uma chamada mesmo que o identificador estático original seja declarado como não público.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. Além OnPropertyChanged disso, os métodos virtuais recebem informações de qualquer propriedade de dependência existente que alterou o valor.Also, OnPropertyChanged virtual methods receive information of any existing dependency property that changed value. Além disso, GetLocalValueEnumerator o método retorna identificadores para qualquer propriedade em instâncias com um valor definido localmente.In addition, the GetLocalValueEnumerator method returns identifiers for any property on instances with a locally set value.

Validação e segurançaValidation and Security

Aplicar uma demanda ValidateValueCallback a um e esperar que a falha de validação em uma falha de demanda para impedir que uma propriedade seja definida não é um mecanismo de segurança adequado.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. A invalidação de valor ValidateValueCallback definido aplicada também pode ser suprimida por chamadores mal-intencionados, se esses chamadores estiverem operando dentro do domínio do aplicativo.Set-value invalidation enforced through ValidateValueCallback could also be suppressed by malicious callers, if those callers are operating within the application domain.

Confira tambémSee also