it-swarm.com.ru

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

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

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

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

102
A. Murray

Скажем, у вашего сайта есть веб-метод 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).

74
SilverlightFox

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

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

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

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

Читать JSON Hijacking от Фила Хаака

52
Murali Murugesan

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

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);
7
Loc Huynh

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

return Json(YourObject, JsonRequestBehavior.AllowGet);
4
keivan kashani