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

问题描述 投票:5回答:3

[在json方法中返回Get时遇到以下ASP.NET MVC错误:

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

显然,此漏洞称为json劫持This article解释了使用json返回Get时可以利用网站。但是以json方法返回Post是安全的。

为什么将Get更改为Post可以防止这种攻击?

javascript json ajax security csrf
3个回答
1
投票
将请求设为POST会阻止任何请求基于CORS policy从其他域发出,除非您将服务器配置为允许它,否则此问题就变成了另一回事。另一方面,浏览器允许GET请求检索资源,例如javascript,这些资源可能包含来自您域的敏感数据,并且碰巧是数组而不是对象。

此在其他related questions中也引用了


1
投票
JSON不应该以GET的形式返回,因为数据可能会被攻击者注入的<script>窃取(例如,如果动态内容未经过HTML转义就加载了)。通过GET方法从服务器请求脚本,因此从服务器以POST发送的任何内容都不会从注入的脚本中运行。通过运行脚本,黑客可以使用您登录的cookie来访问您的JSON,不应允许他们获取。

阅读有关this articlethis SO answer中JSON黑客漏洞的更多信息。


0
投票
如果您在包含脚本,图像,样式表或字体的任何网页上打开网络面板,您将看到所有这些请求都是使用GET HTTP方法完成的。例如,这是对<script>标记加载的文件的请求的样子:

An example of a GET request for a JavaScript file

这是<img>标记加载的文件的示例,看起来像:

An example of a GET request for an image

浏览器只会盲目地相信您,如果您从知道自己正在做的事的任何地方加载这样的资源,它将为您获取(否则CDN之类的东西将不起作用)

与XHR请求相反 !

XHR请求(包括fetch呼叫)已根据CORS政策进行了检查,我相信您已经很熟悉了。 JavaScript将无法对位于不同域(或端口等)上的资源发出任何XHR请求。

因此,您有两种类型的请求策略:

    将使用CHR检查您使用XHR提取的所有内容,但您可以选择所需的任何HTTP请求方法
  1. 您使用imgscriptlink等加载的所有内容都不会根据CORS策略进行检查
  2. 但您仅限于GET HTTP请求
。浏览器还将发送所有cookie,在这种情况下,最重要的是身份验证。这意味着,如果您使用GET提供JSON数组,则可以使用script标记为您获取<。然后,使用本文中提到的技巧,您可以

execute

数组(听起来很奇怪,但是可以)并获取敏感信息。[如果您要使用POST,则攻击者无法使用script(或任何其他)标签执行此请求,因为他们使用GET请求来获取资源。 您可能认为

啊,但是我可以使用form来做到这一点!

,但是您将遇到相同的CORS问题。如果仅提交form,则JSON数据将加载到当前页面中,并且您的攻击者无法获取它,因为您的脚本不再存在于页面中。

您可能认为啊,我只是将form目标设置为iframe

,但是JavaScript不允许您访问iframe中的任何内容。

这有意义吗?

© www.soinside.com 2019 - 2024. All rights reserved.