为什么使用POST方法可以防止json劫持?

Hoo*_*ini 8 javascript security ajax json csrf

jsonGet方法中返回时,我遇到了以下 ASP.NET MVC 错误:

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

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

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

Dor*_*taş 6

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

更新

抱歉,我还没有阅读赏金问题。为什么将请求更改为 post 可以防止 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_endpoint从 from更改GETPOST,当浏览器尝试访问它时,您的服务器将拒绝它。

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