¿Cómo funciona realmente la seguridad .NET?

votos
1

Acabo de ver esta pregunta:

Comprender el parámetro SecurityAction de .NET para permisos

Y tengo una pregunta. Con el siguiente código:

private void button1_Click(object sender, EventArgs e)
{
    Layer1();
    MessageBox.Show(OK);
}

private void Layer1()
{
    try
    {
        Layer2();
    }
    catch (SecurityException)
    {
        MessageBox.Show(Caught);
    }
    Layer2b();
}

private void Layer2()
{
    new System.Security.Permissions.FileIOPermission(PermissionState.Unrestricted).Deny();
    GC.Collect();
    Layer3();
}

private void Layer2b()
{
    Layer3();
}

[FileIOPermission(SecurityAction.LinkDemand, Write=@C:\temp)]
private void Layer3()
{
    using (FileStream stream = new FileStream(@C:\temp\test.txt, FileMode.Create))
    {
    }
}

¿Por qué el código produce una excepción de seguridad con la llamada a Layer2? Cómo se trata el objeto de permiso, me imagino que el recolector de basura destruiría el objeto, ya que no tengo una referencia activa al mismo, pero el código dice Caught , y luego OK , así que claramente la denegación de permiso está en efecto para la llamada a través de Layer2.

¿Lo que da? ¿Qué me estoy perdiendo? Debo admitir que soy un principiante total en lo que respecta al sistema de seguridad / permisos en .NET, así que discúlpeme si esta pregunta es realmente básica.

¿Un permiso / negación de seguridad como este marca la pila o algo así? De lo contrario, ¿por qué no está vigente para Layer2b? Es el mismo hilo, tan claro, mientras que no es eliminado por la recolección de basura, se está eliminando / destruyendo / limpiando en algún momento.

Publicado el 09/12/2008 a las 23:25
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
3

Llamar a .Deny () en una CodeAccessPermission hará que el tiempo de ejecución .NET Security establezca el indicador de denegación en el objeto de seguridad para el marco de pila actual para ese permiso. Entonces, incluso si llama a GC.Collect () después de llamar a .Deny (), en realidad no importa, el permiso seguirá vigente. El objeto de permiso es solo una representación del estado de la parte del tiempo de ejecución de seguridad .NET en un punto en el tiempo (un marco de pila).

Simplemente use .NET Reflector para obtener más información.

Respondida el 09/12/2008 a las 23:39
fuente por usuario

votos
0

A primera vista, supongo que el objeto de permiso todavía está dentro del alcance, ya que está definido dentro del método, queda fuera del alcance después de completar el método Layer2, lo que permite que funcione la última línea de la aplicación.

Como se señala en la respuesta aceptada, esto se debe a que está en el alcance de la pila actual, relacionada con el alcance del objeto estándar, simplemente no se administra la referencia. Esa es la mejor manera de recordarlo

Respondida el 09/12/2008 a las 23:36
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more