将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);