[在json
方法中返回Get
时遇到以下ASP.NET MVC错误:
此请求已被阻止,因为可能会泄露敏感信息在GET请求中使用时向第三方网站披露。要允许GET请求,请将JsonRequestBehavior设置为AllowGet。
显然,此漏洞称为json劫持。 This article解释了使用json
返回Get
时可以利用网站。但是以json
方法返回Post
是安全的。
为什么将Get
更改为Post
可以防止这种攻击?
POST
会阻止任何请求基于CORS policy从其他域发出,除非您将服务器配置为允许它,否则此问题就变成了另一回事。另一方面,浏览器允许GET
请求检索资源,例如javascript,这些资源可能包含来自您域的敏感数据,并且碰巧是数组而不是对象。 此在其他related questions中也引用了
GET
的形式返回,因为数据可能会被攻击者注入的<script>
窃取(例如,如果动态内容未经过HTML转义就加载了)。通过GET
方法从服务器请求脚本,因此从服务器以POST
发送的任何内容都不会从注入的脚本中运行。通过运行脚本,黑客可以使用您登录的cookie来访问您的JSON,不应允许他们获取。阅读有关this article和this SO answer中JSON黑客漏洞的更多信息。
GET
HTTP方法完成的。例如,这是对<script>
标记加载的文件的请求的样子:这是<img>
标记加载的文件的示例,看起来像:
浏览器只会盲目地相信您,如果您从知道自己正在做的事的任何地方加载这样的资源,它将为您获取(否则CDN之类的东西将不起作用)
与XHR请求相反 !
XHR请求(包括fetch
呼叫)已根据CORS政策进行了检查,我相信您已经很熟悉了。 JavaScript将无法对位于不同域(或端口等)上的资源发出任何XHR请求。因此,您有两种类型的请求策略:
img
,script
,link
等加载的所有内容都不会根据CORS策略进行检查GET
HTTP请求GET
提供JSON数组,则可以使用script
标记为您获取<。然后,使用本文中提到的技巧,您可以execute
数组(听起来很奇怪,但是可以)并获取敏感信息。[如果您要使用POST
,则攻击者无法使用script
(或任何其他)标签执行此请求,因为他们使用GET
请求来获取资源。 您可能认为啊,但是我可以使用form
来做到这一点!
form
,则JSON数据将加载到当前页面中,并且您的攻击者无法获取它,因为您的脚本不再存在于页面中。您可能认为啊,我只是将form
目标设置为iframe
!
iframe
中的任何内容。这有意义吗?