Seguridad de las propiedades de dependencia

Por lo general, las propiedades de dependencia deben considerarse propiedades públicas. La naturaleza del sistema de propiedades de Windows Presentation Foundation (WPF) impide la capacidad de hacer garantías de seguridad sobre el valor de una propiedad de dependencia.

Procedimiento para acceder a los contenedores y las propiedades de dependencia y protegerlos

Normalmente, las propiedades de dependencia se implementan junto con las propiedades Common Language Runtime (CLR) del "contenedor", que permiten obtener o establecer fácilmente la propiedad de una instancia. Pero los contenedores no son más que métodos de conveniencia que implementan las llamadas estáticas subyacentes GetValue y SetValue que se usan al interactuar con propiedades de dependencia. Visto de otro modo, las propiedades se exponen como propiedades Common Language Runtime (CLR) que están respaldadas por una propiedad de dependencia en lugar de un campo privado. Los mecanismos de seguridad que se aplican a los contenedores no imitan el comportamiento del sistema de propiedades ni el acceso a la propiedad de dependencia subyacente. Procesar una petición de seguridad en el contenedor solo evitará el uso del método de conveniencia, pero no evitará las llamadas a GetValue o SetValue. De forma similar, aplicar un nivel de acceso protegido o privado en los contenedores no proporciona ninguna seguridad efectiva.

Si escribe sus propias propiedades de dependencia, debe declarar los contenedores y el campo de identificador DependencyProperty como miembros públicos, para que los llamadores no obtengan información confusa sobre el verdadero nivel de acceso de esa propiedad (debido a que su almacén se implementa como una propiedad de dependencia).

Para una propiedad de dependencia personalizada, puede registrar su propiedad como una propiedad de dependencia de solo lectura, lo que le proporcionará un medio eficaz para impedir que cualquier usuario que no tenga una referencia a DependencyPropertyKey de esa propiedad la establezca. Para obtener más información, consulte Propiedades de dependencia de solo lectura.

Nota:

Declarar un campo de identificador DependencyProperty privado no está prohibido y se puede usar para ayudar a reducir el espacio de nombres expuesto inmediatamente de una clase personalizada. Una propiedad de este tipo no debe considerarse "privada" en el mismo sentido que las definiciones de lenguaje common language runtime (CLR) definen ese nivel de acceso, por los motivos que se describen en la siguiente sección.

Exposición del sistema de propiedades de las propiedades de dependencia

Generalmente, declarar un elemento DependencyProperty en cualquier nivel de acceso distinto de público no resulta útil y puede generar confusión. Ese valor de nivel de acceso solo impide que alguien pueda obtener una referencia a la instancia de la clase de declaración. Sin embargo, existen varios aspectos del sistema de propiedades que devolverán una clase DependencyProperty como medio para identificar una propiedad determinada tal como existe en una instancia de una clase o una instancia de una clase derivada. Este identificador aún se puede usar en una llamada a SetValue, aunque el identificador estático original esté declarado como no público. Además, los métodos virtuales OnPropertyChanged reciben información de cualquier propiedad de dependencia que haya cambiado de valor. Además, el método GetLocalValueEnumerator devuelve identificadores para cualquier instancia de propiedades con un valor establecido localmente.

Validación y seguridad

Aplicar una demanda a ValidateValueCallback y esperar un error de validación sobre un error de demanda para impedir que una propiedad se establezca no es un mecanismo de seguridad adecuado. Los autores de llamada malintencionados pueden suprimir la invalidación del valor establecido que se aplica a través de ValidateValueCallback, si esos autores de llamadas funcionan dentro del dominio de aplicación.

Vea también