将 JsonRequestBehavior 设置为 AllowGet 时可以披露哪些“敏感信息”

当我在 returning Json时(使用内置的 MVC JsonResult helper) ,每次从浏览器的地址栏测试一个新的 URL时,我都会得到同样的错误:

该请求已被阻止,因为在 GET request中使用敏感信息时,可能会向第三方网站披露这些信息。要允许 GET requests,请将 JsonRequestBehavior设置为 AllowGet

这一次,我没有咕哝确认并启动 Fiddler 执行 post 请求,而是想知道 GET请求暴露了什么,而 POST请求没有暴露什么?

116486 次浏览

默认情况下,ASP.NET MVC Framework 不允许你响应 一个带有 JSON 有效负载的 GET 请求,因为恶意用户有可能通过名为 JSON 劫持的进程获得对有效负载的访问。您不希望在 GET 请求中使用 JSON 返回敏感信息。

如果需要发送 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);
}

下面是 Phil Haack JSON Hijacking关于为什么不使用带 GET 方法的 Json 的一篇有趣的文章

假设你的网站有一个 GetUser网络方法:

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

返回一个 JSON 响应:

{ "Name": "John Doe" }

如果这个方法只接受 POST 请求,那么只有当使用 POST 方法向 http://www.example.com/User/GetUser/32发出 AJAX 请求时,内容才会返回到浏览器。请注意,除非您已经实现了 CORS,否则浏览器将保护数据不受其他域向您发出此请求的影响。

但是,如果允许 GET 请求,并且使用 GET 而不是 POST 发出类似于上面的 AJAX 请求,那么恶意用户可能会使用 HTML 中的 script标记将您的 JSON 包含在他们自己站点的上下文中。例如在 www.evil.com:

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

这个 JavaScript 对于 www.evil.com应该是没有用的,因为没有办法读取 web 方法返回的对象。然而,由于旧版本浏览器(例如 Firefox 3)的 bug,JavaScript 原型对象有可能被重新定义,使得 www.evil.com有可能读取你的方法返回的数据。这被称为 JSON 劫持。

请参阅 这篇文章了解防止这种情况的一些方法。然而,这并不是现代浏览器(Firefox,Chrome,IE)的后期版本的已知问题。

在报税表中,请使用下列表格:

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

当我们想要从 MVC 应用程序向客户机返回一个 json 对象时,我们应该显式地指定 JsonRequestBehavior。返回对象时允许获取。因此,我返回以下 json 数据来解决这个问题:

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);

您必须使用 JsonRequestBehavior:

return Json(YourObject, JsonRequestBehavior.AllowGet);

返回 Json (“ Success”,JsonRequestBehavior. AllowGet)