Answers:
假设您的网站具有GetUser
网络方法:
http://www.example.com/User/GetUser/32
返回JSON响应:
{ "Name": "John Doe" }
如果此方法仅接受POST请求,则仅当http://www.example.com/User/GetUser/32
使用POST方法发出AJAX请求时,内容才返回给浏览器。请注意,除非您实施了CORS,否则浏览器将保护数据免受来自其他域的请求。
但是,如果您随后允许GET请求以及通过GET而不是POST发出与上述类似的AJAX请求,则恶意用户可以通过使用script
HTML中的标记将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)不是已知问题。
www.example.com/User/DeleteUser/32
因为该请求将包括cookie,因为它们来自受害人的机器,因此对于身份验证是必需的。[Authorize]
也救不了你无论是在一个非常古老的浏览器的情况下,这里详述的攻击-这是他们自己的访问用户www.evil.com
因此请求www.evil.com
使得以www.example.com
将包含授权cookie。
默认情况下,ASP.NET MVC框架不允许您使用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方法一起使用
返回Json(“ Success”,JsonRequestBehavior.AllowGet)