Partager via


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

Les propriétés de dépendance doivent généralement ê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 la possibilité de garantir la sécurité d’une valeur de propriété de dépendance.

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

En règle générale, les propriétés de dépendance sont implémentées avec les propriétés clR (Common Language Runtime) « wrapper » qui simplifient l’obtention ou la définition de la propriété à partir d’une instance. Mais les wrappers sont vraiment des méthodes pratiques qui implémentent les appels sous-jacents GetValue et SetValue statiques utilisés lors de l’interaction avec les propriétés de dépendance. En pensant à cela d’une autre manière, les propriétés sont exposées en tant que propriétés CLR (Common Language Runtime) qui se produisent sous la forme d’une propriété de dépendance plutôt que par un champ privé. Les mécanismes de sécurité appliqués aux wrappers ne sont pas identiques au comportement du système de propriétés et au niveau d’accès de la propriété de dépendance sous-jacente. Le placement d’une demande de sécurité sur le wrapper empêche uniquement l’utilisation de la méthode pratique, mais n’empêche pas les appels vers GetValue ou SetValue. De même, placer un niveau d’accès privé ou protégé sur les wrappers ne procure pas une sécurité efficace.

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

Pour une propriété de dépendance personnalisée, vous pouvez inscrire votre propriété en tant que propriété de dépendance en lecture seule, et cela permet d’empêcher la définition d’une propriété par toute personne qui ne contient pas de référence à cette DependencyPropertyKey propriété. Pour plus d’informations, consultez Propriétés de dépendance en lecture seule.

Remarque

La déclaration d’un DependencyProperty champ d’identificateur privé n’est pas interdite et elle peut être utilisée de manière concevable pour réduire l’espace de noms immédiatement exposé d’une classe personnalisée, mais 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 CLR (Common Language Runtime) définissent ce niveau d’accès, pour des raisons décrites dans la section suivante.

Exposition des propriétés de dépendance par le système de propriétés

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

Validation et sécurité

L’application d’une demande à une ValidateValueCallback demande et l’attente de l’échec de validation sur un échec de 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 valeur définie appliquée par le biais ValidateValueCallback peut également être supprimée par des appelants malveillants, si ces appelants fonctionnent dans le domaine d’application.

Voir aussi