none
Ocultar variables id en URL RRS feed

  • Pregunta

  • Buenas tardes. Os quería preguntar ¿cómo se puede ocultar en una aplicación MVC  los id de las url, para que el usuario no pueda modificarlos?.

    Conozco lo de utilizar el método POST o utilizar la sessión. Pero mi caso es el siguiente:

    Tengo un grid con una serie de columnas. Una de ellas es para acceder al detalle del registro seleccionado (mediante un link). Al hacer clic, la url de la nueva página es

    Http://miweb.com/miArea/microntrolador/mioperacion/13

    Necesito que no se vea dicho id.

    Gracias.

    lunes, 30 de julio de 2012 18:45

Respuestas

  • Buenas!

    Si la web está estructurada en Áreas, en la clase donde se registra un área, MiAreaAreaRegistration.cs, ¿se puede incluir el nuevo routehanler (  UnencriptedRouteHandler())?.  Al consultar los parámetros que tiene el método MapRoute de context, no reconocía en ellos el parámetro para indicar el nuevo routhandler.

    Si.  Usa el objeto devuelto por MapRoute:

                var route = context.MapRoute(
                    "Demo_default",
                    "Demo/{controller}/{action}/{id}",
                    new { action = "Index", id = UrlParameter.Optional }
                );
    
                route.RouteHandler = new UnencriptedRouteHandler();

    Y por último, si a los métodos Action que recibían un id, lo llamaba de una forma distinta a "id", no le llegaban los valores desencriptados, sino nulos.  Al cambiar el nombre del parámetro de mi Action a id, ya le llegaba el valor desencriptado correctamente.

    No termino de entender a que te refieres... Si me lo puedes aclarar, please ;-)

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Javier13 martes, 28 de agosto de 2012 17:56
    martes, 28 de agosto de 2012 10:22

Todas las respuestas

  • Me temo que vas a tener que trabajártelo "a mano". Un remedio es cambiar el grid para que en los enlaces meta un pequeño bloque de javascript que haga un POST (en lugar del GET que genera pro defecto cada hiperenlace). Otro remedio es usar criptografía para generar los IDs. Esto no los oculta, pero por lo menos los hace inútiles para quien los vea. Tendrás que cifrarlos en la rutina que carga el Grid, y luego descifrarlos en el método de acción que recibe el Id. Si quieres, puedes usar el identificador de sesión como "semilla" o clave de cifrado, de form que dos usuarios distintos no puedan compartir los ids cifrados.
    martes, 31 de julio de 2012 6:15
  • @Javier13

    Si quieres ver un ejemplo de lo de encriptar el parámetro Id que mencionaba Alberto, hace poco puse en mi blog un post sobre como implementarlo usando un custom route handler de ASP.NET MVC: http://geeks.ms/blogs/etomas/archive/2012/07/08/asp-net-mvc-encriptar-routevalues.aspx

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    martes, 31 de julio de 2012 6:49
  • Muchas gracias por las respuestas. Trataré de seguir las indicaciones comentadas para evitar dicho problema.

    Un saludo.

    martes, 31 de julio de 2012 14:29
  • Buenas tardes.

    Eduard, me ha resultado de mucha utilidad el post de su blog.

    Tan solo añadir que en el método de encriptación y desencriptación que se utilice hay que tener en cuenta los símbolos “+”, “/” y “=” resultantes, tal y como se explica en este enlace http://varionet.wordpress.com/2009/11/06/sobre-base64-para-que-usarlo-para-que-no-y-como-manejarlo-en-net-y-asp-net. Si no se hace, la url resultante de añadir a la ruta  el id encriptado, sería errónea.

     Sólo me ha surgido dos dudas:

    - Si la web está estructurada en Áreas, en la clase donde se registra un área, MiAreaAreaRegistration.cs, ¿se puede incluir el nuevo routehanler (  UnencriptedRouteHandler())?.  Al consultar los parámetros que tiene el método MapRoute de context, no reconocía en ellos el parámetro para indicar el nuevo routhandler.

    No consigo que se entre en el método UnencriptedRouteHandler() desde una página incluida en un área.  Lo que tengo por ahora en el método para registrar el área es:

    public override void RegisterArea(AreaRegistrationContext context)

            {
                context.MapRoute( "Miarea_default", "MiArea/{controller}/{action}/{_id}",  new { action = "Index", _id = UrlParameter.Optional },   new[] { "MiEspacioDeNombre.Areas.MiArea.Controllers" }
                );
            }

    Y por último, si a los métodos Action que recibían un id, lo llamaba de una forma distinta a "id", no le llegaban los valores desencriptados, sino nulos.  Al cambiar el nombre del parámetro de mi Action a id, ya le llegaba el valor desencriptado correctamente.

    Cualquier indicación sería de mucha ayuda.

    Muchas gracias.

    lunes, 27 de agosto de 2012 18:58
  • Buenas!

    Si la web está estructurada en Áreas, en la clase donde se registra un área, MiAreaAreaRegistration.cs, ¿se puede incluir el nuevo routehanler (  UnencriptedRouteHandler())?.  Al consultar los parámetros que tiene el método MapRoute de context, no reconocía en ellos el parámetro para indicar el nuevo routhandler.

    Si.  Usa el objeto devuelto por MapRoute:

                var route = context.MapRoute(
                    "Demo_default",
                    "Demo/{controller}/{action}/{id}",
                    new { action = "Index", id = UrlParameter.Optional }
                );
    
                route.RouteHandler = new UnencriptedRouteHandler();

    Y por último, si a los métodos Action que recibían un id, lo llamaba de una forma distinta a "id", no le llegaban los valores desencriptados, sino nulos.  Al cambiar el nombre del parámetro de mi Action a id, ya le llegaba el valor desencriptado correctamente.

    No termino de entender a que te refieres... Si me lo puedes aclarar, please ;-)

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Javier13 martes, 28 de agosto de 2012 17:56
    martes, 28 de agosto de 2012 10:22
  • Muchas gracias por la aclaración. Era lo que necesitaba saber.

    Un saludo.


    martes, 28 de agosto de 2012 17:57