将JsonRequestBehavior设置为AllowGet时,可以披露哪些"敏感信息"

A. *_*ray 107 security asp.net-mvc json http-get http-post

每当我URL在浏览器的地址栏中测试一个新的时候,我都会遇到同样的错误returning Json:使用内置的MVC JsonResult helper:

此请求已被阻止,因为敏感信息可能会在第三方网站上使用时向第三方网站披露GET request.允许GET requests,设置JsonRequestBehaviorAllowGet.

而不是咕噜咕噜地承认并解雇Fiddler做一个帖子请求,这一次,我想知道GET一个POST请求确实暴露了一个请求不是什么?

Old*_*ain 106

在您的退货中使用以下内容:

return this.Json("you result", JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)

  • 这实际上如何回答OP的问题?所有这些答案都告诉大家如何解决这个异常问题. (6认同)
  • 告诉人们忽视安全警告而不至少解释后果是不负责任的.-1 (3认同)
  • 是的,使用它.. 就像尝试用空捕获来捕获一样。不要使用这些家伙(在您了解风险之前)。-1'd (2认同)

Sil*_*Fox 78

假设您的网站有GetUser网络方法:

http://www.example.com/User/GetUser/32

它返回一个JSON响应:

{ "Name": "John Doe" }
Run Code Online (Sandbox Code Playgroud)

如果此方法仅接受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>
Run Code Online (Sandbox Code Playgroud)

这个JavaScript应该没用,www.evil.com因为没有办法读取web方法返回的对象.但是,由于旧版浏览器(例如Firefox 3)中存在错误,因此可以重新定义JavaScript原型对象,从而可以www.evil.com读取方法返回的数据.这被称为JSON Hijacking.

有关防止这种情况的一些方法,请参阅此帖 但是,现代浏览器的更高版本(Firefox,Chrome,IE)不是已知问题.

  • 好的帖子,但是如果你在控制器中包含[Authorize]标签,则无需担心安全问题.希望这段代码可以帮助别人,Json(returnMsg,JsonRequestBehavior.AllowGet) (22认同)
  • @ Dhanuka777:遗憾的是不正确.如果该方法有副作用,可能会发生[CSRF](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29)攻击(例如`www.example.com/User/DeleteUser/32 `)因为请求将包括需要进行身份验证的cookie,因为它们来自受害者的机器.`[Authorize]`也不会让你免受这里详细描述的攻击 - 如果是一个非常古老的浏览器 - 用户自己正在访问`www.evil.com`,所以请求`www.evil.com`对` www.example.com`将包含授权cookie. (16认同)
  • 如果操作有任何副作用,则永远不应使用 GET 方法调用它——约定是使用 GET 仅用于读取数据,所有副作用操作都应使用 POST、PUT、DELETE 等。换句话说,我只是认为这个“敏感信息”错误消息具有误导性。如果开发人员按照应该使用的方式使用 GET 方法,那么一切都很好!:) (2认同)

Mur*_*san 55

默认情况下,ASP.NET MVC框架不允许您使用JSON有效负载响应GET请求,因为恶意用户有可能通过称为JSON Hijacking的进程获取对有效负载的访问权限.您不希望在GET请求中使用JSON返回敏感信息.

如果您需要发送JSON以响应GET,并且不暴露敏感数据,则可以通过将JsonRequestBehavior.AllowGet第二个参数传递给Json 方法来明确允许该行为.

阅读JSON HijackingPhil Haack

  • 我不认为HTTPS有帮助. (5认同)
  • 好帖子.你应该使用HTTPS的充分理由. (2认同)

Loc*_*ynh 8

当我们想要从MVC应用程序返回一个json对象到客户端时,我们应该在返回一个对象时显式指定JsonRequestBehavior.AllowGet.结果,我返回如下的json数据来克服这个问题:

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)


kei*_*ani 7

您必须使用JsonRequestBehavior.AllowGet进行Json Response,如下所示:

return Json(YourObject, JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)