Какая "конфиденциальная информация" может быть раскрыта при установке 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);