Partilhar via


Segurança Patrimonial de Dependência

As propriedades de dependência devem geralmente ser consideradas propriedades públicas. A natureza do sistema de propriedades do Windows Presentation Foundation (WPF) impede a capacidade de fazer garantias de segurança sobre o valor de uma propriedade de dependência.

Acesso e segurança de wrappers e propriedades de dependência

Normalmente, as propriedades dependentes são implementadas junto com as propriedades CLR (Common Language Runtime) "wrapper" que simplificam o acesso ou a definição da propriedade de uma instância. Mas os wrappers são apenas métodos de conveniência que implementam as chamadas estáticas subjacentes GetValue e SetValue utilizadas ao interagir com propriedades de dependência. Pensando nisso de outra forma, as propriedades são expostas como propriedades CLR (Common Language Runtime) que são apoiadas por uma propriedade de dependência em vez de por um campo privado. Os mecanismos de segurança aplicados aos wrappers não correspondem ao comportamento do sistema de propriedades nem ao acesso da propriedade de dependência subjacente. Colocar uma exigência de segurança no invólucro apenas impedirá o uso do método de conveniência, mas não impedirá chamadas para GetValue ou SetValue. Da mesma forma, colocar o nível de acesso protegido ou privado nos invólucros não fornece qualquer segurança eficaz.

Se você estiver escrevendo suas próprias propriedades de dependência, deverá declarar os wrappers e o campo de identificador de DependencyProperty como membros públicos, para que os chamadores não obtenham informações enganosas sobre o verdadeiro nível de acesso dessa propriedade (devido ao seu armazenamento ser implementado como uma propriedade de dependência).

Para uma propriedade de dependência personalizada, você pode registrar sua propriedade como uma propriedade de dependência somente leitura, e isso fornece um meio eficaz de impedir que uma propriedade seja definida por qualquer pessoa que não tenha uma referência ao DependencyPropertyKey dessa propriedade. Para obter mais informações, consulte Read-Only Propriedades de dependência.

Observação

Declarar um campo de identificador de DependencyProperty privado não é proibido e pode ser usado para ajudar a reduzir o namespace imediatamente exposto de uma classe personalizada, mas tal propriedade não deve ser considerada "privada" no mesmo sentido que as definições de linguagem CLR (Common Language Runtime) definem esse nível de acesso, por motivos descritos na próxima seção.

Exposição do Sistema de Propriedades de Dependência

Em geral, não é útil, e é potencialmente enganoso, declarar uma DependencyProperty como qualquer nível de acesso que não seja público. Essa configuração de nível de acesso apenas impede que alguém consiga obter uma referência à instância da classe declarante. Mas há vários aspetos do sistema de propriedades que retornarão um DependencyProperty como o meio de identificar uma propriedade específica como ela existe em uma instância de uma classe ou uma instância de classe derivada, e esse identificador ainda é utilizável em uma chamada de SetValue, mesmo que o identificador estático original seja declarado como não público. Além disso, os métodos virtuais OnPropertyChanged recebem informações de qualquer propriedade de dependência existente cujo valor tenha sido alterado. Além disso, o método GetLocalValueEnumerator retorna identificadores para qualquer propriedade em instâncias com um valor definido localmente.

Validação e Segurança

Aplicar um requerimento a um ValidateValueCallback e esperar que uma falha de requerimento impeça uma propriedade de ser atribuída não é um mecanismo de segurança adequado. A invalidação de valor de conjunto imposta por meio de ValidateValueCallback também pode ser suprimida por chamadores mal-intencionados, se esses chamadores estiverem operando dentro do domínio do aplicativo.

Ver também