Sécurité de propriété de dépendance

Mise à jour : novembre 2007

Les propriétés de dépendance doivent en général être considérées comme des propriétés publiques. La nature du système de propriétés Windows Presentation Foundation (WPF) empêche de définir des garanties de sécurité à propos d'une valeur de propriété de dépendance.

Cette rubrique comprend les sections suivantes.

  • Accès et sécurité des wrappers et des propriétés de dépendance
  • Exposition du système de propriétés pour les propriétés de dépendance
  • Rubriques connexes

Accès et sécurité des wrappers et des propriétés de dépendance

En général, les propriétés de dépendance sont implémentées avec les propriétés Common Language Runtime (CLR) « wrapper » qui simplifient l'obtention ou la définition de la propriété à partir d'une instance. Cependant, les wrappers ne sont que des méthodes pratiques pour implémenter les appels statiques GetValue et SetValue sous-jacents utilisés lors de l'interaction avec les propriétés de dépendance. D'un autre point de vue, les propriétés sont exposées en tant que propriétés Common Language Runtime (CLR) qui sont stockées par une propriété de dépendance et non par un champ privé. Les mécanismes de sécurité appliqués aux wrappers ne placent pas en parallèle le comportement du système de propriétés et l'accès de la propriété de dépendance sous-jacente. Le fait de placer une demande de sécurité sur le wrapper empêchera seulement l'utilisation de la méthode pratique mais n'empêchera pas les appels à GetValue ou SetValue. De même, le fait de placer un niveau d'accès protégé ou privé sur les wrappers n'offre pas de sécurité efficace.

Si vous écrivez vos propres propriétés de dépendance, vous devez déclarer les wrappers et le champ d'identificateur DependencyProperty comme membres publics, afin que les appelants n'obtiennent pas d'informations trompeuses sur le niveau d'accès réel de cette propriété (car son magasin est implémenté en tant que propriété de dépendance).

Pour une propriété de dépendance personnalisée, vous pouvez enregistrer votre propriété comme propriété de dépendance en lecture seule. Vous empêchez ainsi efficacement qu'une propriété définie par une personne ne contiennent pas de référence au DependencyPropertyKey pour cette propriété. Pour plus d'informations, consultez Propriétés de dépendance en lecture seule.

Remarque :

Vous pouvez éventuellement déclarer comme privé un champ d'identificateur DependencyProperty, par exemple pour réduire l'espace de noms immédiatement exposé d'une classe personnalisée. Cependant, une telle propriété ne doit pas être considérée comme « privée » dans le même sens que les définitions de langage Common Language Runtime (CLR) définissent ce niveau d'accès. Les raisons sont décrites dans la section suivante.

Exposition du système de propriétés pour les propriétés de dépendance

Il n'est généralement pas utile, et même potentiellement trompeur, de déclarer un niveau d'accès autre que public pour une DependencyProperty. Ce paramètre de niveau d'accès empêche seulement à une personne d'obtenir une référence à l'instance auprès de la classe déclarant. Toutefois, plusieurs aspects du système de propriétés retourneront une DependencyProperty comme moyen d'identifier une propriété telle qu'elle existe sur une instance d'une classe ou d'une classe dérivée. Cet identificateur peut être utilisé dans un appel SetValue même si l'identificateur statique d'origine est déclaré comme non public. De même, les méthodes virtuelles OnPropertyChanged reçoivent des informations de toute propriété de dépendance existante dont la valeur a changé. En outre, la méthode GetLocalValueEnumerator retourne des identificateurs pour toute propriété sur des instances avec une valeur localement définie.

Validation et sécurité

Le fait d'appliquer une demande à un ValidateValueCallback et d'attendre l'échec de validation sur l'échec d'une demande pour empêcher la définition d'une propriété n'est pas un mécanisme de sécurité adéquat. L'invalidation de la valeur définie appliquée via ValidateValueCallback pourrait également être supprimée par des appelants malveillants, si ces derniers opèrent dans le domaine d'application.

Voir aussi

Concepts

Propriétés de dépendance personnalisées