前段時間寫了個前后端分離的項目,前后端都是我一個人完成,通信都是通過接口進行的,這時候就要面對接口安全的問題,api無法使用laravel框架提供的csrf-token等安全措施,我只做了個簡單的基於session的驗證。我的所有api都是通過ajax來進行的,心想既然有跨域限制,不允許跨域的話是不是就萬事大吉了呢?跨域限制僅僅是瀏覽器的行為嗎?服務器有跨域限制嗎?
(此處有誤,可以使用csrf-token,但是在發起post請求前必須獲取到cookie中的token,將其加入header中,可以加在單頁的入口html里,或者來一次get請求)
如果只是瀏覽器的行為,那么就能輕松繞過了,沒有意義。
帶着這個問題查了一些資料,講同源策略的很多,很多地方都說這是web安全的基石,但是沒看到哪里明確的提到這只是瀏覽器的行為,和服務端、http沒有關系。
於是自己做個實驗咯,實驗步驟如下:
- 在阿里雲服務器上用beego起一個后端應用,弄一個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