前段时间写了个前后端分离的项目,前后端都是我一个人完成,通信都是通过接口进行的,这时候就要面对接口安全的问题,只做了个简单的基于 session 的验证。所有 api 都是通过 ajax 来进行的,心想既然有跨域限制,不允许跨域的话是不是就万事大吉了呢?跨域限制仅仅是浏览器的行为吗?服务器有跨域限制吗?
如果只是浏览器的行为,那么就能轻松绕过了,没有意义。
带着这个问题查了一些资料,讲同源策略的很多,很多地方都说这是 web 安全的基石,但是没看到哪里明确的提到这只是浏览器的行为,和服务端、http 没有关系。
于是自己做个实验咯,实验步骤如下:
- 在阿里云服务器上用 Go 起一个后端应用,弄一个 test 接口,不设置 Access-Control-Allow-Origin
- 服务器上写一个静态页面,有个按钮点击发送 ajax 请求 test 接口
- 本地弄一个同样的页面
- 本地弄一个代理服务器,转发test至阿里云服务器
分别进行如下测试:
- 线上页面在浏览器中发请求到线上服务器
- 本地页面在浏览器中发请求到线上服务器
- 修改 allow-origin 为 *,本地页面在浏览器中发请求到线上服务器
- 不设置 allow-origin,本地页面在浏览器中通过代理服务器请求接口
- 不设置 allow-origin,使用 postman 等工具请求接口
测试结果:除了第二种情况,其他的均能进行跨域请求,结论就是跨域限制仅仅是浏览器的行为,通过代理服务器,或者其他工具发送请求就能轻松绕过。
那么,同源策略是不是没有什么卵用呢?
错,同源策略是 web 安全的基石,当然很重要了
因为:
随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。
(1) Cookie、LocalStorage 和 IndexDB 无法读取。
(2) DOM 无法获得。
(3) AJAX 请求不能发送。
如果在其他域名能读 qq.com 的 cookie 那就相当于它能拿到登陆权限。
reference:
浏览器同源政策及其规避方法-阮一峰
浏览器的同源策略-mdn
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。