Supongamos que su sitio web tiene un GetUser
método web:
http://www.example.com/User/GetUser/32
que devuelve una respuesta JSON:
{ "Name": "John Doe" }
Si este método acepta solo solicitudes POST, entonces el contenido solo se devolverá al navegador si se realiza una solicitud AJAX http://www.example.com/User/GetUser/32
mediante el método POST. Tenga en cuenta que, a menos que haya implementado CORS , el navegador protegerá los datos de otros dominios que realicen esta solicitud al suyo.
Sin embargo, si permitió las solicitudes GET, además de realizar una solicitud AJAX similar a la anterior con GET en lugar de POST, un usuario malintencionado podría incluir su JSON en el contexto de su propio sitio mediante el uso de una script
etiqueta en el HTML. por ejemplo, en www.evil.com
:
<script src="http://www.example.com/User/GetUser/32"></script>
Este JavaScript debería ser inútil www.evil.com
porque no debería haber forma de leer el objeto devuelto por su método web. Sin embargo, debido a errores en las versiones antiguas de los navegadores (por ejemplo, Firefox 3), es posible redefinir los objetos prototipo de JavaScript y hacer posible la www.evil.com
lectura de los datos devueltos por su método. Esto se conoce como secuestro de JSON.
Consulte esta publicación para conocer algunos métodos para prevenir esto. Sin embargo, no es un problema conocido con las versiones posteriores de los navegadores modernos (Firefox, Chrome, IE).
www.example.com/User/DeleteUser/32
), ya que la solicitud incluirá las cookies necesarias para la autenticación, ya que provienen de la máquina de la víctima.[Authorize]
tampoco lo salvará del ataque que se detalla aquí en el caso de un navegador muy antiguo: es el propio usuario quien lo visita,www.evil.com
por lo que la solicitud quewww.evil.com
realizawww.example.com
contendrá la cookie de autorización.en su devolución utilice lo siguiente:
fuente
De forma predeterminada, el marco ASP.NET MVC no le permite responder a una solicitud GET con una carga útil JSON, ya que existe la posibilidad de que un usuario malintencionado pueda obtener acceso a la carga útil a través de un proceso conocido como secuestro de JSON. No desea devolver información confidencial utilizando JSON en una solicitud GET.
Si necesita enviar JSON en respuesta a un GET y no está exponiendo datos confidenciales, puede permitir explícitamente el comportamiento pasando
JsonRequestBehavior.AllowGet
como un segundo parámetro alJson
método.Como
Aquí hay un artículo interesante de Phil Haack
JSON Hijacking
sobre por qué no usar Json con el método GETfuente
Cuando queremos devolver un objeto json al cliente desde la aplicación MVC, debemos especificar explícitamente JsonRequestBehavior.AllowGet al devolver un objeto. Como resultado, devuelvo los datos json de la siguiente manera para solucionar el problema:
fuente
Debe usar JsonRequestBehavior.AllowGet para la respuesta Json de esta manera:
fuente
return Json ("Éxito", JsonRequestBehavior.AllowGet)
fuente