不可不知的網路基石: 同源政策(SOP)與跨來源資源共享(CORS)
同源政策(Same-Origin Policy,SOP)
同源政策(Same-Origin Policy,SOP) 是一種由瀏覽器實施的安全措施,在網頁瀏覽器中,同源政策會限制不同源網站之間的資源訪問。所謂"同源"是指網址的 通訊協定(http 或 https)、網域(domain) 和通訊埠(port) 必須完全相同。只有同源的網頁才能互相訪問彼此的資源,如讀取JavaScript物件、操作DOM元素等。
以 https://www.example.com 這個網址為例,以下幾個例子說明哪些屬於同源或非同源:
// 同源
1. https://www.example.com/index
2. https://www.example.com/about
// 非同源
1. http://www.example.com // 協議不同(一個是https,另一個是http)
2. https://sub.example.com // 的域名不同(一個是www.example.com,另一個是sub.example.com)
3. https://www.example.com:443 // 的端口號不同
為什麼要有同源政策?它保護了什麼?
同源政策的核心目的是限制一個網站只能訪問和操作與該網站來源相同的資源,這項政策對於網路用戶的安全至關重要,主要保護範圍包括用戶隱私、敏感資訊、以及網絡應用的整體安全性。接下來讓我們來討論幾個一般用戶可能會遇到的攻擊情境,以及在這些攻擊情境下,同源政策是如何保護用戶的隱私與資訊的。
範例1: 禁止跨域讀取 Cookies 中的敏感訊息
- 攻擊情境:
假設一個用戶登入了銀行網站 MyBank (https://mybank.com),這個網站為用戶設置了一個含有認證信息的 Cookie。如果用戶同時瀏覽另一個惡意網站 EvilSite (https://evil-site.com),這個惡意網站可能會試圖透過用戶的瀏覽器讀取 MyBank 設置的 Cookie 來獲取用戶的敏感信息。
- 同源政策的保護:
由於同源政策的限制,EvilSite 無法讀取 MyBank 設置的 Cookie,因此用戶的登入憑證和其他敏感資訊得到了保護。
範例2: 阻止CSRF攻擊
CSRF是一種劫持受信任用戶的攻擊方式。攻擊者在受害者當前已登陸的網站上傳送伪造的惡意請求,例如更改用戶的個人信息或密碼、轉帳等高權限操作。
CSRF之所以能夠成功,是因為伺服器無法區分出惡意請求和合法請求,僅憑瀏覽器自動附加的Cookie 等認證就會被服務器認為是可信請求。
- 攻擊情境:
舉例來說,攻擊者創建了一個惡意網站 EvilSite (https://evil-site.com),這個網站包含一個自動提交到 Transfer API (https://mybank.com/transfer) 的表單。這個表單會在訪問者不知情的情況下,嘗試從其銀行帳戶中轉賬到攻擊者指定的帳戶。用戶訪問 EvilSite 時,如果用戶之前沒有從銀行網站登出,表單就會嘗試使用用戶的登入狀態進行轉賬。
- 同源政策的保護:
但因為銀行網站和惡意網站不是同源,瀏覽器將不會自動發送 MyBank (https://mybank.com) 的認證信息(如 Cookies)到 EvilSite。即使 EvilSite 的請求能夠帶上用戶在 MyBank 上的 Cookies,但銀行網站可以透過檢查請求的 Referer Header,來檢驗請求是否來自同源。如果 Referer 顯示請求不是來自 MyBank(即本案例中為 EvilSite (https://evil-site.com)),銀行的伺服器會識別出這是一個跨站請求,並阻止這筆交易。
範例3: DOM無權訪問限制
- 攻擊情境:
假設一名用戶正在瀏覽銀行網站 MyBank (https://mybank.com),同時,用戶打開了一個含有惡意腳本的網頁 EvilSite (https://evil-site.com)。該惡意腳本試圖透過 JavaScript 來讀取或修改 MyBank 上開啟的頁面的 DOM 內容,例如試圖讀取用戶的銀行賬戶信息或自動填充轉賬表單。
- 同源政策的保護:
由於同源政策的限制,EvilSite 的腳本無法直接訪問或修改 MyBank 頁面的 DOM。這個政策確保了即使用戶的瀏覽器中同時開啟了惡意網站,這些網站也無法直接操作或竊取來自其他來源(如銀行網站)的敏感信息。
範例4: 保護簡單請求免受資源竊取
- 攻擊情境:
假設一個用戶已登錄 MyBank (https://mybank.com) 的情況下,若該用戶同時訪問了惡意網站EvilSite (https://evil-site.com),後者企圖對https://mybank.com/api/userinfo 發起一個 GET 請求,意圖竊取用戶的個人資訊。由於 GET 請求通常被視為 "簡單請求" (不會改變伺服器上的資源),伺服器端不會檢查該請求。
- 同源政策的保護:
根據同源政策,即便回應能從MyBank返回,EvilSite 也無法讀取這個回應的內容,因此,用戶的資料保持安全。
範例5: 阻止惡意站點發起高風險請求
- 攻擊情境:
假設 MyBank (https://mybank.com) 允許用戶透過表單提交資料進行資金轉賬。當用戶登錄後,他們可以執行轉賬操作。與此同時,如果用戶不小心訪問了一個惡意網站 EvilSite (https://evil-site.com),這個網站嘗試透過用戶的瀏覽器發起 POST 請求到 Transfer API (https://mybank.com/transfer) 來進行未授權的資金轉賬。
- 同源政策的保護:
瀏覽器會首先發送預檢請求到 MyBank 的伺服器端,詢問是否允許來自 EvilSite 的跨域請求。如果 MyBank 的伺服器端沒有明確返回允許的回應(例如設置了正確的 CORS Header: Access-Control-Allow-Origin),則該請求不會執行。這種機制有效防止了惡意站點能夠發起高風險操作,如資金轉移。