Какая "конфиденциальная информация" может быть раскрыта при установке JsonRequestBehavior на AllowGet

Я получаю ту же самую старую ошибку каждый раз, когда я тестирую новый URL из моей адресной строки браузера, когда я returning Json (используя встроенный MVC JsonResult helper):

Этот запрос заблокирован, потому что конфиденциальная информация может быть раскрыта на сторонних веб-сайтах, если это используется в GET request. Чтобы разрешить GET requests, установите JsonRequestBehavior в AllowGet.

Вместо того, чтобы хрюкать в подтверждении и запускать Fiddler для выполнения запроса на почту, на этот раз мне интересно, что это такое, что запрос GET показывает, что запрос POST не работает?

Ответ 1

Скажите, что ваш сайт имеет веб-метод GetUser:

http://www.example.com/User/GetUser/32

который возвращает ответ JSON:

{ "Name": "John Doe" }

Если этот метод принимает только запросы POST, содержимое возвращается только в браузер, если запрос AJAX сделан в http://www.example.com/User/GetUser/32 с использованием метода POST. Обратите внимание: если вы не внедрили CORS, браузер будет защищать данные из других доменов, делающих этот запрос вашим.

Однако, если вы разрешили GET-запросы, а также выполнили запрос AJAX, аналогичный указанному выше, с GET вместо POST, злоумышленник мог бы включить ваш JSON в контексте своего собственного сайта с помощью тега script в HTML. например на www.evil.com:

<script src="http://www.example.com/User/GetUser/32"></script>

Этот JavaScript должен быть бесполезным для www.evil.com, потому что не должно быть способа чтения объекта, возвращаемого вашим веб-методом. Однако из-за ошибок в старых версиях браузеров (например, Firefox 3) объекты JavaScript-прототипа могут быть переопределены и позволяют www.evil.com читать ваши данные, возвращаемые вашим методом. Это известно как JSON Hijacking.

См. этот пост для некоторых способов предотвращения этого. Однако это не известная проблема с более поздними версиями современных браузеров (Firefox, Chrome, IE).

Ответ 2

в вашем возврате используйте следующее:

return this.Json("you result", JsonRequestBehavior.AllowGet);

Ответ 3

По умолчанию среда ASP.NET MVC не позволяет вам отвечать на запрос GET с полезной нагрузкой JSON, поскольку существует вероятность, что злоумышленник может получить доступ к полезной нагрузке с помощью процесса, известного как JSON Hijacking. Вы не хотите возвращать конфиденциальную информацию, используя JSON в запросе GET.

Если вам нужно отправить JSON в ответ на GET и не раскрывать конфиденциальные данные, вы можете явно разрешить поведение, передав JsonRequestBehavior.AllowGet в качестве второго параметра Json. метод.

Такие как

  [HttpGet] //No need to decorate, as by default it will be GET
  public JsonResult GetMyData(){  
    var myResultDataObject = buildMyData(); // build, but keep controller thin
    // delegating buildMyData to builder/Query Builder using CQRS makes easy :)
    return Json(myResultDataObject, JsonRequestBehavior.AllowGet);
  }

Вот интересная статья Фила Хаака JSON Hijacking о том, почему не использовать Json с методом GET

Ответ 4

Когда мы хотим вернуть объект json клиенту из приложения MVC, мы должны указать JsonRequestBehavior.AllowGet при возврате объекта. В результате я возвращаю данные json, как описано ниже, чтобы решить эту проблему:

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);

Ответ 5

Вы должны использовать JsonRequestBehavior.AllowGet для ответа Json следующим образом:

return Json(YourObject, JsonRequestBehavior.AllowGet);