2008-12-09 15 views
5

¿Alguien puede explicar el significado y los propósitos de los valores para SecurityAction enum?Descripción del parámetro "SecurityAction" de .NET para los permisos

La página MSDN no es muy clara. Dice que LinkDemand se produce en compilación justo a tiempo mientras que Demand ocurre en tiempo de ejecución.

¿Por qué la distinción y en qué situaciones usaría LinkDemand en lugar de Demand?

Del mismo modo, ¿cuáles son los casos de uso de otros valores interesantes como InheritenceDemand, Assert y PermitOnly?

Respuesta

18

LinkDemand básicamente requiere que el código de llamada tenga el permiso especificado. La demanda, por otro lado, requiere no solo que el código de llamada tenga el permiso especificado, sino también el código que llamó al código de llamada, y el código que lo llamó, y así sucesivamente, a lo largo de la pila (o hasta que Se encuentra Assert, ver abajo).

LinkDemand se puede aplicar en tiempo de compilación JIT, porque si el compilador JIT golpea una instrucción que llama a un método con un LinkDemand, puede determinar inmediatamente si el código de llamada tiene el permiso o no. La demanda tiene que aplicarse en tiempo de ejecución cada vez que se realiza una llamada al método, porque no es posible en tiempo de compilación saber qué habrá en la pila durante una llamada determinada. Como tal, LinkDemand es mucho más eficiente. Sin embargo, la compensación por esa eficiencia es menos seguridad. Con LinkDemand, confía en que el código de llamada no permitirá que el código de llamada ITS (que puede o no tener el permiso) lo use con fines nefastos. (En otras palabras, confía en que no existen agujeros de seguridad en el código de llamada que sus emisores puedan explotar para obtener acceso indirecto al método con LinkDemand.) Con Demanda, usted sabe que todos en la pila tienen absolutamente permiso (en al menos hasta que se encuentre un Assert), por lo que no hay riesgo de personas que no son de confianza.

Assert es básicamente un cortocircuito para la demanda. La comprobación de seguridad que ocurre con la Demanda se detiene si una persona que llama en la pila tiene un Assert activo (en otras palabras, solo las personas que llaman en la pila hasta el Assert deben tener el permiso). Entonces, al igual que LinkDemand, debes confiar en que el código con el Assert no puede ser explotado por sus llamadores.

Denegar también es un cortocircuito para Demand, pero en lugar de afirmar un permiso, anula un permiso que podría tener la persona que llama. Debería usar esto para ayudar a prevenir posibles agujeros de seguridad al asegurar que no existan permisos extraños durante una llamada que pueda ser explotable.

PermitOnly es como Denegar, excepto que en lugar de negar un permiso específico, niega todos los permisos EXCEPTO el especificado.

InheritanceDemand, a diferencia de los demás, no está directamente relacionado con las llamadas a métodos, pero dice que una clase que no tiene el permiso no puede heredar de la clase con InheritanceDemand. Esto podría usarse, por ejemplo, para evitar que el código que no es de confianza acceda a los miembros protegidos de la clase que de otro modo serían accesibles para las clases descendientes.

Cuestiones relacionadas