将JsonRequestBehavior设置为AllowGet时可能会泄漏哪些“敏感信息

wfveoks0  于 2023-03-04  发布在  其他
关注(0)|答案(6)|浏览(164)

当我是returning Json时(使用内置的MVC JsonResult helper),每次我从浏览器的地址栏测试新的URL时,我都会收到同样的错误:
此请求已被阻止,因为在GET request中使用此请求时,敏感信息可能会泄露给第三方网站。若要允许GET requests,请将JsonRequestBehavior设置为AllowGet
这一次,我想知道GET请求到底暴露了POST请求没有暴露的东西,而不是咕哝着承认并启动Fiddler去做一个post请求?

m1m5dgzv

m1m5dgzv1#

在返回时使用以下内容:

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

ecfsfe2w2#

假设您的网站具有GetUser web方法:
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劫持。
请参阅this post了解一些防止此问题的方法。然而,这不是现代浏览器(Firefox,Chrome,IE)的最新版本的已知问题。

nzrxty8p

nzrxty8p3#

默认情况下,ASP.NETMVC框架不允许您使用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的有趣文章,介绍了为什么不将Json与GET方法结合使用

afdcj2ne

afdcj2ne4#

当我们想从MVC应用中返回一个json对象给客户端时,需要在返回对象时显式指定JsonRequestBehavior.AllowGet,因此我返回json数据如下,以克服这个问题:

return Json(yourObjectData, JsonRequestBehavior.AllowGet);
bn31dyow

bn31dyow5#

您必须像这样使用JsonRequestBehavior.AllowGet作为Json响应:

return Json(YourObject, JsonRequestBehavior.AllowGet);
vcudknz3

vcudknz36#

return Json(“成功”,Json请求行为.允许获取)

相关问题