Zoner & Seguridad de Acceso a Código

Los que han estado desarrollando aplicaciones de escritorio con .NET, seguramente saben que el CLR es el encargado de lo que puede o no hacer una aplicación en función a los permisos que reciba.

Code Access Security

Por si no saben todavía de la existencia de Zoner, ésta es una pequeña herramienta que permite probar si una determinada aplicación funciona o no en una zona determinada.

Este es el código de Zoner:

csharp:
using System;
using System.Reflection;
using System.Security;
using System.Security.Policy;

class App
{
    public static void Main(String[] args)
    {
        try
        {
            SecurityZone zone = SecurityZone.Internet;
            String url = "http://www.IBuySpy.com";
            String exe;
            String[] newArgs = null;

            for (Int32 index = 0; ; index++)
            {
                if (args[index][0] != '-' && args[index][0] != '/')
                {
                    exe = args[index];
                    newArgs = new String[args.Length - (index + 1)];
                    Array.Copy(args, index + 1, newArgs, 0, newArgs.Length);
                    break;
                }

                String setting = args[index].Substring(3);

                switch (args[index].ToUpper()[1])
                {
                    case 'Z': // Set zone
                        zone = (SecurityZone) Enum.Parse(typeof(SecurityZone), setting, true);
                        break;
                    case 'U': // Set url
                        url = setting;
                        break;
                    default:
                        throw (new ApplicationException());
                }
            }
            StartApp(exe, newArgs, zone, url);
        }
        catch (ArgumentException)
        {
            Usage();
        }
        catch (IndexOutOfRangeException)
        {
            Usage();
        }
        catch (ApplicationException) { Usage(); }
    }
    static void Usage()
    {
        Console.WriteLine(
           "Usage: zoner /u:[url] /z:[zone] [Executable File]\n" +
           "[url]\tUrl indicating the source of this .exe");
        Console.WriteLine();
        Console.Write("[zone]");
       
        String[] zones = Enum.GetNames(typeof(SecurityZone));
        foreach (String zone in zones)
        {
            Console.WriteLine("\t{0}", zone);
        }
        Console.WriteLine(
           "\nDefault:  zoner /u:http://www.IBuySpy.com /z:Internet");
    }
   
    static void StartApp(String exe,
       String[] newArgs, SecurityZone zone, String url)
    {
        Evidence evidence = new Evidence();

        evidence.AddHost(new Zone(zone));
        evidence.AddHost(new Url(url));
        AppDomain app = AppDomain.CreateDomain(exe, evidence);
        app.ExecuteAssembly(exe, evidence, newArgs);
    }
}

Lo que hace esta porción de código, es simplemente ejecutar en otro dominio la aplicación que se quiere probar, pero adjuntando información de la zona escogida.

Espero que esta pequeña utilidad les ayude a ahorrar un poco de tiempo :).

One Reply to “Zoner & Seguridad de Acceso a Código”

  1. Hola, estoy tratando de limitar el acceso a una webservice modificando el webconfig.
    Lo que yo necesito hacer es que un webservice sea accesible solo desde la intranet, y no se pueda acceder desde internet.
    Esto necesito hacerlo por código, el asmx está programado en C#,
    necesito identificar cuando la llamada sea interna y no permitir el
    acceso cuando la llamada sea desde la web ya que está en un sitio
    publico y tengo que compartir el servicio entre dos aplicaciones que
    lo consumen.
    Encontré algo relacionado a ZoneIdentityPermission class, que se
    agrega al webmethod:

    [WebMethod, ZoneIdentityPermission(SecurityAction.LinkDemand, Zone =
    SecurityZone.Intranet)]
    Pero al agregarlo hace diferencia en la ejecución, por lo que entiendo
    esperaba que al llamar al webmethod me dé un error o no lo deje
    ejecutar y en cambio el webmethod funciona igual.

    Desde ya, muchas gracias por cualquier ayuda!
    Saludos.

Comments are closed.