2009-04-13 11 views
21

En ASP.NET MVC (enrutamiento por defecto), me gustaría usar una URL como esta para volver una vista con una forma de editar un cliente:Algo más seguro que los campos de formulario ocultos en ASP.NET MVC?

/Customers/Edit/5 

Necesito hacer uso de CustomerId=5, pero no quiero para permitir a un cliente a cambiar Enderece ahora hago el id oculta usando:

<%= Html.Hidden("CustomerId") %> 

con esto se logran lo que quiero, pero estoy bajo la impresión de que las variables de formulario ocultos no son seguras y puede ser manipulado por el usuario final.

Entonces, ¿cuál es la mejor manera de permitir que un cliente edite su información pero no su ID?

Respuesta

12

Mi solución fue usar el código de corrección de manipulaciones de Steven Sanderson's ASP.NET MVC book. La idea es que se crea un hash de cualquier campo de formulario oculto que deseas prueba de manipulaciones:

<%= Html.Hidden("CustomerId") %> 
<%= Html.Hidden("CustomerIdHash") %> 

Cuando se envía el formulario, el código de Steven calcula entonces otra hash del CustomerId y se asegura de que es igual CustomerIdHash. Si lo hace, entonces no ha habido manipulación. Es un gran código, y vale la pena el precio del libro.

+4

¡Asegúrese de saltear ese hash, de lo contrario no habrá ganado nada! (Confío en que el libro lo explique con más detalle). – teedyay

+0

Correcto y también supongo que debe enviar el FormCollection a su método de publicación como parámetro para que la comparación pueda ejecutarse en el campo de entrada hash en lugar de simplemente enviar su modelo al método de publicación. Opcionalmente, podría agregar un campo seguro a su modelo para que el valor del hash pueda enviarse y vincularse también a su modelo. – Matt

6

No realiza ninguna seguridad real en el lado del navegador. Puede colocar la ID del cliente en la cadena de consulta, pero el servidor debe validar si realmente se le permite editar ese cliente. Si no, devuelve un error.

10

Compruebe los permisos en la acción de su controlador (/ Clientes/Editar) antes de mostrar la vista correspondiente. Tenga en cuenta que el problema aquí no está en absoluto en su campo oculto: un usuario podría simplemente escribir "http://yoursite.com/Customers/Edit/10" en su navegador. Por lo tanto, debe verificar en su acción si el usuario tiene permiso para editar los detalles solicitados del cliente, sin importar cómo invocó la acción.

+1

Veo cómo configurar una acción de controlador para que solo los usuarios autorizados puedan ver una Vista para una ID en particular, pero no veo cómo evitar que un usuario cambie esa ID. Por ejemplo, un usuario podría estar autorizado para ver/Customers/Edit/10, pero luego podrían cambiar el ID al enviar el formulario y editar una ID que no estaban autorizados a ver en primer lugar (por ejemplo,/Customers/Edit/11). Supongo que necesito verificar el formulario enviado para asegurarme de que la identificación es lo que les envié en primer lugar. – royco

+1

Debe verificar que el usuario que está conectado actualmente tenga permiso para ver/editar la ID solicitada. Por lo tanto, en la acción de su controlador recupera el nombre de usuario (usando Thread.CurrentPrincipal.Identity.Name, por ejemplo) y verifica en su base de datos si este usuario puede hacer lo que intentó hacer (ver o editar, dependiendo de la acción solicitada). Entonces, si el usuario cambia la identificación, aún no puede ver/editar lo que no le está permitido. En realidad, no hay ninguna razón para que intente cambiar la identificación ... –

1

Hay dos aspectos. No estoy seguro de lo que usted preguntaba directamente sobre, pero son ambos importantes:

  • Para cualquier usuario dado, no se les puede permitir editar todos los clientes. Por lo tanto, como sugiere Dmitry, la acción de su controlador para la publicación del formulario debe observar al cliente que están tratando de editar y verificar que el usuario conectado pueda editar ese cliente. Probablemente también quiera hacer una comprobación similar en la acción del controlador que genera el formulario de edición en primer lugar y ni siquiera les permita acceder al formulario si no pueden editar el cliente solicitado.
  • Para un usuario determinado y un cliente determinado, probablemente no desee que el usuario pueda cambiar la ID del cliente. Si está utilizando el método UpdateModel en su acción de controlador POST, necesita usar el parámetro propiedad whitelist y excluir la propiedad ID para que el usuario no cambie la ID. Incluso si cambian el valor del campo oculto, UpdateModel ignorará el valor modificado a través de la lista blanca.
2

Estoy teniendo el mismo problema y creo que la solución implica el uso de claves sustitutivas. En cada tabla donde tengo una columna ID, también agrego una columna clave que es un Guid (uniqueidentifier en el servidor SQL). Ahora, cuando hago uniones o cualquier lógica interna, uso el ID pero el controlador usa la clave. Como es un Guid, es difícil adivinar cuál es el Guid de otro disco.

Como alternativa (o además de lo anterior) se podría cifrar el campo oculto de acuerdo con This article

3

Los campos ocultos a prueba de manipulaciones están muy bien, pero esa sigue siendo la seguridad a través de la oscuridad. Siempre es mejor asegurar un sitio web, más específicamente MVC, asegurando los controladores y las acciones. Entonces el usuario puede manipular todo lo que quiera y no llegarán a ningún lado.

Cuestiones relacionadas