Segurança de Propriedades de Dependência
Propriedades de dependência devem geralmente ser consideradas propriedades publicas. A natureza do sistema de propriedades do Windows Presentation Foundation (WPF) previne a habilidade de realizar garantias de segurança sobre o valor da propriedade de dependência.
Este tópico contém as seguintes seções.
- Acesso e Segurança de Wrappers e Propriedades de Dependência
- Exposição do Sistema de Propriedades de Propriedades de Dependência
- Tópicos relacionados
Acesso e Segurança de Wrappers e Propriedades de Dependência
Tipicamente, propriedades de dependência são implementadas com "wrapper" de propriedades common language runtime (CLR) que simplificam a obter e definir a propriedade de uma instância. Mas os wrappers são métodos realmente convenientes que implementam as chamadas GetValue e SetValue estáticas subjacentes que são usadas quando interagindo com propriedades de dependência. Pensando isto de outra maneira, as propriedades expostas como propriedades common language runtime (CLR) que estão suportadas por uma propriedade de dependência ao invés de um campo privado. Mecanismos de segurança aplicados aos wrappers não paralelizam o comportamento do sistema de propriedades e acessos a propriedade de dependência subjacente. Colocar um requisito de segurança em um wrapper só irá prevenir o uso do método conveniente mas não irá prevenir chamadas ao GetValue ou SetValue. Similarmente, colocar níveis de acesso protegido ou privado nos wrappers não fornece nenhuma segurança efetiva.
Se você está escrevendo sua própria propriedade de dependência, você deve declarar os wrappers e o campo identificador DependencyProperty como membros públicos, de modo que quem os chamar não pegue a informação errônea sobre o nível de acesso daquela propriedade (porque seu armazenamento é 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 não fornece maneiras efetivas de prevenir uma propriedade de dependência ser definida por qualquer um que não queira guardar uma referência para o DependencyPropertyKey daquela propriedade. Para obter mais informações, consulte Read-Only Dependency Properties.
Observação: |
---|
Declarando um DependencyPropertyidentificador de campo particular não é proibido e ele perfeitamente pode ser usado para ajudar a reduzir o espaço para nome exposto imediatamente de uma classe personalizada, mas essa propriedade não deve ser considerada "particular" no mesmo sentido sistema autônomo o common language runtime (CLR) definições de linguagem definem nível de acesso, por motivos descritos na próxima seção. |
Exposição do Sistema de Propriedades de Propriedades de Dependência
Não é geralmente útil, e potencialmente induz a erro, declarar um DependencyProperty com qualquer nível de acesso diferente de público. Aquele nível de acesso definido só previne alguém de ser capaz de pegar uma referência para a instância da classe declarante. Mas há vários aspectos do sistema de propriedades que irão retornar um DependencyProperty como o modo de identificar uma propriedade particular enquanto existe em uma instância de uma classe ou uma instância de uma classe derivada, e este identificador ainda é usável em uma chamada SetValue mesmo que o identificador estático original é declarado como não pública. Além disso, métodos OnPropertyChanged virtuais recebem informação de qualquer propriedade de dependência existente que mudaram de valor. Adicionalmente, o método GetLocalValueEnumerator retorna identificadores para qualquer propriedade em instâncias com valores definidos localmente.
Validação e Segurança
Aplicar uma demanda ao ValidateValueCallback e esperar a falha na validação em uma falha de demanda para prevenir a propriedade de ser definida não é um mecanismo de segurança adequado. Invalidação de valor definido por ser forçado por meio do ValidateValueCallback podem também ser suprimidos por chamadores maliciosos, se esses chamadores estão operando dentro do domínio da aplicação.