¿Cómo deben los desarrolladores manejar las variables POST del formulario que entran en conflicto con las variables de ruta?

1

En ASP.NET MVC, cuando realizo una publicación HTTP a /controller/action/UserID ...

y tiene una ruta correspondiente /controller/action/{UserID} ...

y si hago un Formulario POST, los datos POSTed UserID sobrescriben todo lo que originalmente decía la ruta. (al menos lo hace en ASP.NET MVC4)

Para mí, esto dice algunas cosas:

  • No confíe en la URL ... ya que los datos PUBLICADOS pueden ocultar lo que realmente sucede.
  • Cualquier persona que pueda adivinar los nombres de las variables de ruta en ASP.NET MVC, puede poner datos inesperados en un controlador

  • ....?

Preguntas

  • ¿Este comportamiento es consistente en otros marcos MVC (Rails, etc.)?
  • ¿Cuáles son algunas formas de protegerse contra este tipo de resultados inesperados? ¿Deberían verificarse todos los POST con parámetros de URL?
pregunta random65537 26.11.2013 - 01:26
fuente

2 respuestas

1
  

No confíe en la URL ... ya que los datos PUBLICADOS pueden ocultar lo que realmente sucede.

La URL debe tratarse como un valor del lado del cliente y no se debe confiar de ninguna manera. Cualquiera puede alterar fácilmente la URL y puede crear fácilmente un POST para cualquier UserID .

  

Cualquier persona que pueda adivinar los nombres de las variables de ruta en ASP.NET MVC, puede poner datos inesperados en un controlador

Esto puede suceder de todos modos por manipulación de parámetros. Hay algunos consejos útiles en esta guía: enlace

Específicamente

  

¿Qué es? La manipulación de parámetros es un ataque en el que se modifican los parámetros para cambiar la funcionalidad esperada de la aplicación. Los parámetros pueden estar en un formulario, cadena de consulta, cookies, base de datos, etc. Discutiré los ataques que involucran parámetros basados en la Web.

     

¿Cómo se explota? Un atacante altera los parámetros para engañar a la aplicación para que realice una acción que no pretendía. Supongamos que guarda el registro de un usuario leyendo su ID de usuario de la cadena de consulta. ¿Es esto seguro? No. Un atacante puede manipular una URL en su aplicación

En MVC esto puede suceder a través del enlace de modelo:

  

El enlace del modelo es una gran característica de Model-View-Controller (MVC) que ayuda con las comprobaciones de parámetros, ya que las propiedades en el objeto Orden se completarán automáticamente y se convertirán a sus tipos definidos en función de la información del formulario. ... Solo tenga cuidado de limitar las propiedades que permite que se completen y, de nuevo, no confíe en los datos de la página para los elementos importantes. ...

     

Tenga en cuenta que uso el atributo [Bind (Exclude)] aquí para limitar lo que MVC está enlazando en mi modelo para controlar lo que hago o no confío. Esto garantiza que el ID de usuario no provenga de los datos del formulario y, por lo tanto, no pueda ser manipulado.

Por lo tanto, también debe tener cuidado de que los parámetros de formulario que no existen en su vista no puedan ser manipulados y agregados por un usuario malintencionado. Lo haría agregando el atributo Exclude :

public ActionResult Edit([Bind(Exclude="UserId")] Order order)

  

¿Este comportamiento es consistente en otros marcos MVC (Rails, etc.)?

No estoy seguro, pero no lo veo como una falla, ya que las verificaciones de permisos deben realizarse en los POST y en los GET. Su aplicación no debe suponer que una URL que se haya enviado POSTED tenga permiso para hacer esto solo debido a la falsa afirmación de que la URL con el formulario debe haberse cargado primero.

  

¿Cuáles son algunas formas de protegerse contra este tipo de resultados inesperados? ¿Deberían verificarse todos los POST con parámetros de URL?

El código simplemente debería decidir tomar la variable de ruta o la variable POST (si se le proporciona desde MVC como una variable de método llamada UserID , entonces ¿por qué no usar eso? No importa si fue de POST datos o la URL siempre que sea coherente), y luego tome todas las decisiones lógicas basadas en eso. Esto incluye la autorización inicial y también la lógica de procesamiento y de negocios; todos deben usar el mismo origen del valor para asegurarse de que las acciones solo se realicen cuando estén autorizadas.

    
respondido por el SilverlightFox 27.11.2013 - 11:41
fuente
0

Si desea separar o distinguir las acciones GET / POST, debe usar el atributo AcceptVerbs . Por ejemplo, para forzar que una acción responda solo a las solicitudes POST, agregue el siguiente atributo:

[AcceptVerbs(HttpVerbs.Post)]

Y también agrega lo siguiente al GET uno

[AcceptVerbs(HttpVerbs.Get)]

Al hacer esto, puede asegurarse de que solo los tipos de solicitud deseables (GET, POST, ...) puedan tocar el método de acción.

Y sobre el otro lado de su pregunta, hay un ataque web relacionado con todos los marcos MVC llamados Over Posting y puede ocurrir si confía completamente en el cuaderno de modelos. Para evitar este ataque, tienes dos formas:

  • Usar modelos de vista
  • Usando el atributo Bind

Creo que el primero es claro. Y sobre el segundo, puede endurecer un método de acción POST como el siguiente:

[AcceptVerbs(HttpVerbs.Get)]     
public ActionResult AddComment([Bind(Include = "Name, Email, CommentText")] Comment model)

Además, el atributo Bind también se puede agregar a la propia definición del modelo.

    
respondido por el AminSaghi 17.03.2015 - 07:53
fuente

Lea otras preguntas en las etiquetas