Sicherheit von Abhängigkeitseigenschaften
Aktualisiert: November 2007
Abhängigkeitseigenschaften sollten in der Regel als öffentliche Eigenschaften angesehen werden. Die Beschaffenheit des Windows Presentation Foundation (WPF)-Eigenschaftensystems verhindert, dass für den Wert einer Abhängigkeitseigenschaft Sicherheitsgarantien aufgestellt werden.
Dieses Thema enthält folgende Abschnitte.
- Zugriff und Sicherheit von Wrappern und Abhängigkeitseigenschaften
- Eigenschaftensystem-Offenlegung von Abhängigkeitseigenschaften
- Verwandte Abschnitte
Zugriff und Sicherheit von Wrappern und Abhängigkeitseigenschaften
Normalerweise werden Abhängigkeitseigenschaften zusammen mit common language runtime (CLR)-Wrappereigenschaften implementiert, die das Abrufen und Festlegen der Eigenschaft über eine Instanz vereinfachen. Bei den Wrappern handelt es sich jedoch lediglich um Hilfsmethoden, die die zugrunde liegenden statischen Aufrufe GetValue und SetValue implementieren, die beim Interagieren mit Abhängigkeitseigenschaften verwendet werden. Sie können es sich auch so vorstellen, dass die Eigenschaften als common language runtime (CLR)-Eigenschaften offengelegt werden, die von einer Abhängigkeitseigenschaft unterstützt werden, anstatt von einem privaten Feld. Sicherheitsmechanismen, die auf Wrapper angewendet werden, gelten nicht parallel zum Verhalten des Eigenschaftensystems und zum Zugriff auf die zugrunde liegende Abhängigkeitseigenschaft. Das Versehen des Wrappers mit einer Sicherheitsforderung verhindert lediglich die Verwendung der Hilfsmethode, jedoch keine Aufrufe an GetValue oder SetValue. Auch das Versehen der Wrapper mit geschützten oder privaten Zugriffsebenen bietet keine effektive Sicherheit.
Wenn Sie Ihre eigenen Abhängigkeitseigenschaften schreiben, sollten Sie die Wrapper und das DependencyProperty-Bezeichnerfeld als öffentliche Member deklarieren, damit Aufrufer keine irreführenden Informationen zur geltenden Zugriffsebene der Eigenschaft erhalten (da als Speicher eine Abhängigkeitseigenschaft implementiert ist).
Für eine benutzerdefinierte Abhängigkeitseigenschaft können Sie Ihre Eigenschaft als schreibgeschützte Abhängigkeitseigenschaft registrieren. So können Sie auf effektive Weise verhindern, dass eine Eigenschaft von beliebigen Elementen festgelegt wird, die über keinen Verweis auf den DependencyPropertyKey für die jeweilige Eigenschaft verfügen. Weitere Informationen finden Sie unter Schreibgeschützte Abhängigkeitseigenschaften.
Tipp
Das Deklarieren eines DependencyProperty-Bezeichnerfelds ist nicht unzulässig, und Sie können diesen Ansatz verwenden, um dazu beizutragen, den sofort offengelegten Namespace einer benutzerdefinierten Klasse zu reduzieren. Eine Eigenschaft dieser Art ist jedoch nicht in gleichem Maße als "privat" anzusehen wie die common language runtime (CLR)-Sprachdefinitionen, die diese Zugriffsebene definieren. Die Gründe dafür sind im nächsten Abschnitt beschrieben.
Eigenschaftensystem-Offenlegung von Abhängigkeitseigenschaften
Es ist im Allgemeinen nicht ratsam und ggf. irreführend, für eine DependencyProperty eine andere Zugriffsebene als "öffentlich" zu deklarieren. Diese Zugriffsebeneneinstellung verhindert lediglich, dass von der deklarierenden Klasse aus ein Verweis auf die Instanz eingerichtet wird. Es gibt jedoch mehrere Aspekte des Eigenschaftensystems, die eine DependencyProperty als Mittel zum Identifizieren einer bestimmten Eigenschaft zurückgeben, wie diese in der Instanz einer Klasse oder abgeleiteten Klasse vorhanden ist. Dieser Bezeichner kann auch dann in einem SetValue-Aufruf verwendet werden, wenn der ursprüngliche statische Bezeichner als nicht öffentlich deklariert wird. Virtuelle OnPropertyChanged-Methoden erhalten Informationen zu vorhandenen Abhängigkeitseigenschaften, deren Wert sich geändert hat. Außerdem gibt die GetLocalValueEnumerator-Methode Bezeichner für alle Eigenschaften von Instanzen mit einem lokal festgelegten Wert zurück.
Validierung und Sicherheit
Das Anwenden einer Forderung auf einen ValidateValueCallback und die Erwartung, dass eine fehlgeschlagene Validierung eines Forderungsfehlschlags verhindert, dass eine Eigenschaft festgelegt wird, ist kein geeigneter Sicherheitsmechanismus. Die Ungültigkeit von festgelegten Werten per ValidateValueCallback kann auch von böswilligen Aufrufern erzwungen werden, wenn diese Aufrufer sich innerhalb der Anwendungsdomäne befinden.