设置Access-Control-Allow-Origin有哪些安全风险?
我最近不得不将Access-Control-Allow-Origin
为*
,以便能够进行跨子域的Ajax调用。
现在我不禁感到,我正在把我的环境安全风险。
如果我做错了,请帮助我。
通过使用Access-Control-Allow-Origin: *
响应,请求的资源允许与每个来源共享。 这基本上意味着任何站点都可以向您的站点发送XHR请求并访问服务器的响应,如果您没有实现此CORS响应,情况就不会如此。
因此,任何网站都可以代表访问者向您的网站提出请求并处理其响应。 如果你有一些实现类似于基于浏览器(cookie,基于cookie的会话等)自动提供的authentication或授权scheme的东西,由第三方站点触发的请求也将使用它们。
这确实会带来安全风险,特别是如果您允许资源共享不仅仅是选定的资源,而且是每个资源。 在这种情况下,你应该看看什么时候启用CORS是安全的? 。
AFAIK,Access-Control-Allow-Origin只是一个从服务器发送到浏览器的http头。 将其限制到特定地址(或禁用它)并不会使您的网站更安全,例如,机器人。 如果机器人想要,他们可以忽略标题。 常规的浏览器(资源pipe理器,浏览器等)默认荣誉头。
服务器端在返回响应时实际上并不检查请求的“起源”。 它只是添加了http头。 发送请求的浏览器(客户端)决定读取访问控制头并对其执行操作。 请注意,在XHR的情况下,它可能会使用特殊的“选项”请求首先要求标题。
所以,任何具有创造性脚本function的人都可以轻易地忽略整个标题,无论它是什么。
另请参阅设置Access-Control-Allow-Origin的可能的安全问题 。
这里有两个例子发表评论,当通配符是真正有问题的:
假设我login到我的银行网站。 如果我转到其他页面,然后返回到我的银行,我仍然因为cookie而login。 互联网上的其他用户可以像我一样在我的银行中访问相同的URL,但是如果没有Cookie,他们将无法访问我的帐户。 如果允许跨域请求,恶意网站可以有效模仿用户。
– 布拉德
假设你有一个普通的家庭路由器,比如Linksys WRT54g或者其他东西。 假设路由器允许交叉源请求。 我的网页上的脚本可能会向通用路由器IP地址(如192.168.1.1)发出HTTP请求,并重新configuration您的路由器以允许攻击。 它甚至可以直接使用您的路由器作为DDoS节点。 (大多数路由器都有testing页面,允许ping或简单的HTTP服务器检查,这些检查页面可能被滥用。
– 布拉德
我觉得这些评论应该是答案,因为他们用一个真实的例子解释了这个问题。
你在使用CORS吗? 通过跨域AJAX请求获取的数据可能会对发出请求的服务器构成安全风险,但是我认为跨域AJAX请求的解决scheme是为用户代理实现对已知数据types的parsing和/或validationXHR完成了error handling(很像jQuery.ajax用dataType设置为“json”)。