每次我使用returning Json
(使用内置的MVC JsonResult helper
)从浏览器的地址栏测试新的URL
时,都会得到相同的老错误:
此请求已被阻止,因为在
GET request
中使用此请求时,敏感信息可能会泄露给第三方网站。要允许GET requests
,请将JsonRequestBehavior
设置为AllowGet
。
这一次,我想知道POST
请求不能公开的究竟是什么,而不是发出确认并启动Fiddler来执行post请求。
发布于 2014-02-01 22:06:51
假设您的网站有一个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方法返回的对象。但是,由于旧版本浏览器(例如Firefox3)中的错误,可能会重新定义JavaScript原型对象,并使www.evil.com
能够读取您的方法返回的数据。这就是所谓的JSON劫持。
有关防止这种情况的一些方法,请参阅this post。然而,在更高版本的现代浏览器(Firefox、Chrome、IE)中,这并不是一个已知的问题。
发布于 2015-05-18 18:20:06
在您的回报中使用以下内容:
return this.Json("you result", JsonRequestBehavior.AllowGet);
发布于 2014-01-30 17:55:02
默认情况下,JSON框架不允许您使用ASP.NET有效负载响应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方法一起使用
https://stackoverflow.com/questions/21452925
复制相似问题