跨域限制仅仅是浏览器的行为吗?

前段时间写了个前后端分离的项目,前后端都是我一个人完成,通信都是通过接口进行的,这时候就要面对接口安全的问题,api无法使用laravel框架提供的csrf-token等安全措施,我只做了个简单的基于session的验证。我的所有api都是通过ajax来进行的,心想既然有跨域限制,不允许跨域的话是不是就万事大吉了呢?跨域限制仅仅是浏览器的行为吗?服务器有跨域限制吗?

(此处有误,可以使用csrf-token,但是在发起post请求前必须获取到cookie中的token,将其加入header中,可以加在单页的入口html里,或者来一次get请求)

如果只是浏览器的行为,那么就能轻松绕过了,没有意义。

带着这个问题查了一些资料,讲同源策略的很多,很多地方都说这是web安全的基石,但是没看到哪里明确的提到这只是浏览器的行为,和服务端、http没有关系。

于是自己做个实验咯,实验步骤如下:

  1. 在阿里云服务器上用beego起一个后端应用,弄一个test接口,不设置Access-Control-Allow-Origin
  2. 服务器上写一个静态页面,有个按钮点击发送ajax请求test接口
  3. 本地弄一个同样的页面
  4. 本地弄一个代理服务器,转发test至阿里云服务器
  5. 分别进行如下测试:

    • 线上页面在浏览器中发请求到线上服务器
    • 本地页面在浏览器中发请求到线上服务器
    • 修改allow-origin为*,本地页面在浏览器中发请求到线上服务器
    • 不设置allow-origin,本地页面在浏览器中通过代理服务器请求接口
    • 不设置allow-origin,使用postman等工具请求接口

测试结果:除了第二种情况,其他的均能进行跨域请求,结论就是跨域限制仅仅是浏览器的行为,通过代理服务器,或者其他工具发送请求就能轻松绕过。

那么,同源策略是不是没有什么卵用呢?
错,同源策略是web安全的基石,当然很重要了

因为:

随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。
(1) Cookie、LocalStorage 和 IndexDB 无法读取。
(2) DOM 无法获得。
(3) AJAX 请求不能发送。

如果在其他域名能读qq.com的cookie那就相当于它能拿到登陆权限

reference:
浏览器同源政策及其规避方法-阮一峰
浏览器的同源策略-mdn

原文地址:https://www.cnblogs.com/yaowen/p/10299704.html