将JsonRequestBehavior设置为AllowGet时,可以披露什么“敏感信息”

当我returning Json (使用内置的MVC JsonResult helper )时,每次从浏览器的地址栏中testing一个新的URL ,我都得到了相同的旧错误:

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

而不是咕噜在承认和火焰小提琴做一个职位请求,这一次,我想知道到底什么是一个GET请求公开POST请求不?

说你的网站有一个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)中的错误,可能会重新定义JavaScript原型对象,并使www.evil.com能够读取您的方法返回的数据。 这就是所谓的JSON劫持。

看到这个职位的一些方法来防止这一点。 但是,现代浏览器的更高版本(Firefox,Chrome,IE)并不是已知的问题。

在你的回报中使用以下内容:

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

默认情况下,ASP.NET MVC框架不允许您使用JSON负载来响应HTTP GET请求。 如果您需要发送JSON以响应GET,则需要使用JsonRequestBehavior.AllowGet作为Json方法的第二个参数来显式允许该行为。 但是,恶意用户有机会通过称为JSON劫持的过程访问JSON有效负载。 您不希望在GET请求中使用JSON返回敏感信息。

阅读从Phil Haack JSON Hijacking

当我们想从MVC应用程序返回一个json对象给客户端时,我们应该在返回一个对象的时候明确指定JsonRequestBehavior.AllowGet。 结果,我返回json数据如下,以解决这个问题:

  return Json(yourObjectData, JsonRequestBehavior.AllowGet);