首页 > 解决方案 > 为什么使用 POST 方法可以防止 json 劫持?

问题描述

json在方法中返回时,我遇到了以下 ASP.NET MVC 错误Get

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

显然这个漏洞被称为json Hijacking本文解释了json使用Get. 但是返回json一个Post方法是安全的。

为什么要更改GetPost防止这种攻击?

标签: javascriptjsonajaxsecuritycsrf

解决方案


看到这么多人试图证明JSON 劫持仍然是一个安全问题,我真的很惊讶。(当然,如果您仍然使用 Firefox 2、Opera 9 或 Safari 3)。很长一段时间以来,现代浏览器都没有这个问题。您在问题中提到的文章写于 2009 年。您可以查看此帖子以获取有关如何解决问题的更多信息。而且您无需担心JsonRequestBehavior只允许获取和忘记。

更新

抱歉,我还没有阅读赏金问题。为什么更改发布请求可以防止 json 劫持?

您可以在此处找到一篇文章,该文章描述了 JSON 劫持攻击步骤。它如下:

  • 第 1 步:让经过身份验证的用户访问恶意页面。
  • 第 2 步:恶意页面将尝试从用户登录的应用程序访问敏感数据。这可以通过在 HTML 页面中嵌入脚本标签来完成,因为同源策略不适用于脚本标签

    <script src="http://<jsonsite>/json_server.php"></script>

    浏览器将向 json_server.php 发出 GET 请求,并且用户的任何身份验证 cookie 都将与请求一起发送。

    ...

你可以这样想这个场景,用户访问www.yoursite.com并获得身份验证。在该用户离开您的站点并转到恶意站点之后。如果恶意站点有<script src="http://www.yoursite.com/some_endpoint"></script>标签,浏览器会发出 GET 请求。如果返回的数据是 JSON,则站点可以通过对象原型设置器获取敏感数据。(请记住,攻击者会尝试使用 SCRIPT 标签而不是 AJAX 请求,因为同源策略不适用于脚本标签。请参阅跨域网络访问规则。)

但是如果你改变http://www.yoursite.com/some_endpointfromGET到的请求类型POST,当浏览器试图访问它时,你的服务器会拒绝它。

我也在这里留下一本解释概念的旧 MVC 框架书。


推荐阅读