什么是跨域
跨域問題是前端開發(fā)人員面前繞不過去的問題蒋困。
所謂跨域翻擒,通俗點(diǎn)表達(dá),就是當(dāng)前站點(diǎn)汪拥,請(qǐng)求或加載了其他域名的資源达传。
比如當(dāng)前 app.a.com 請(qǐng)求了 file.b.com 的資源,就產(chǎn)生了跨域資源的加載迫筑。
瀏覽器在渲染當(dāng)前頁面時(shí)宪赶,校驗(yàn)網(wǎng)頁請(qǐng)求的資源是否可以安全的在當(dāng)前頁面使用。
比如:
- 是同站點(diǎn)下的資源铣焊,比如 app.a.com/logo.png逊朽,可以直接使用
- 如果是同域名下的資源,比如 file.a.com/logo.png, 這時(shí)會(huì)校驗(yàn)文件的響應(yīng)頭曲伊,看有沒有配置 Access-Control-Allow-* 相關(guān)的訪問控制參數(shù)
- 如果是 file.b.com/logo.png 同樣也會(huì)去校驗(yàn)訪問控制信息信息
如果資源的訪問控制信息不能表面資源可以在當(dāng)前站點(diǎn)使用叽讳,就會(huì)產(chǎn)生跨域的問題追他,瀏覽器會(huì)禁止資源的加載和展示。
也就是說跨域問題其實(shí)是瀏覽器對(duì)資源使用安全策略產(chǎn)生的岛蚤,瀏覽器要保證站點(diǎn)訪問資源是安全邑狸,合法訪問的。
瀏覽器是否可以使用某個(gè)資源有兩個(gè)限制:
- 當(dāng)前站點(diǎn)是否允許使用其他站點(diǎn)涤妒,域名的資源
站點(diǎn)可以配置是否允許訪問其他域名的資源单雾,比如在站點(diǎn)配置一些安全策略
# COEP 跨域嵌入策略,會(huì)阻止頁面加載任何未明確授予文檔許可權(quán)的跨域資源(使用CORP或CORS)她紫。
Cross-Origin-Embedder-Policy: require-corp
# COOP
Cross-Origin-Opener-Policy: same-origin
- 請(qǐng)求的資源是否可以在當(dāng)前站點(diǎn)使用
資源是否開啟了跨域資源共享策略硅堆,決定資源在哪些站點(diǎn)可以被使用,一般解決跨域的時(shí)候贿讹,需要在資源的響應(yīng)頭中配置以下選項(xiàng)
# 跨域資源策略
Cross-Origin-Resource-Policy: same-site | same-origin | cross-origin
# cross-origin 表示該資源被任何站點(diǎn)使用
# 允許通過哪些方法訪問
Access-Control-Allow-Methods: GET | POST | PUT | OPTIONS | HEAD
# 允許哪些域名訪問渐逃, * 代表所有,一般來說不安全
Access-Control-Allow-Origin: *
什么是 SharedArrayBuffer
SharedArrayBuffer(以下簡(jiǎn)稱 SAB) 是一個(gè) javascript 對(duì)象民褂,用于網(wǎng)站線程之間的內(nèi)存數(shù)據(jù)共享茄菊,比如 worker。同樣由于 WebAssembly 使用 worker 模擬了多線程赊堪,所以在這種情況下同樣會(huì)使用到 SAB 做數(shù)據(jù)共享訪問面殖。
為什么使用 SAB 會(huì)遇到跨域問題
18年 spectre 曝光之前,已經(jīng)有不少網(wǎng)站使用了 SAB哭廉。由于 spectre 是 cpu 層面的漏洞脊僚,不太可能通過cpu 升級(jí)去解決,因此當(dāng)時(shí)所有瀏覽器直接禁用了 SAB遵绰,來防止 spectre 的旁路攻擊吃挑。
那么什么是 spectre 攻擊,用通俗一點(diǎn)的話來說街立,就是 cpu 有一個(gè)機(jī)制,叫做預(yù)測(cè)機(jī)制埠通,假如有一個(gè)惡意程序去查詢一個(gè)沒有權(quán)限的信息赎离,操作系統(tǒng)會(huì)返回禁止的信息,本身來說這個(gè)邏輯當(dāng)然沒有問題端辱。但是當(dāng)惡意程序詢問時(shí)梁剔,其實(shí)操作系統(tǒng)即使返回了禁止的信息,但是還是會(huì)因?yàn)轭A(yù)測(cè)機(jī)制會(huì)去執(zhí)行正確答案的邏輯舞蔽,會(huì)導(dǎo)致慢了一小段時(shí)間荣病,比如幾微秒,幾毫米渗柿,這就被惡意程序注意到了个盆,通過每隔一段時(shí)間不斷去嘗試詢問脖岛,達(dá)到獲取正確答案的效果。
惡意程序可以通過 SAB 獲取到其他頁面的敏感信息颊亮。我們都知道 worker 在瀏覽器中有很大的限制柴梆,比如不能訪問 window, document 對(duì)象, SAB 是用來和主線程進(jìn)行數(shù)據(jù)交換訪問的高效方法终惑,也被大量應(yīng)用绍在,這就會(huì)導(dǎo)致 worker 是有辦法通過 SAB 攻擊獲取到主線程的敏感信息。
所以在 spectre 漏洞曝出時(shí)雹有,幾乎所有主流瀏覽器都默認(rèn)關(guān)閉了 SAB 以應(yīng)對(duì)這個(gè)漏洞的攻擊偿渡。
如何解決
SAB 作為 WebAssembly(wasm) 模擬多線程的基礎(chǔ)組件,如果不能使用霸奕,將會(huì)對(duì) wasm 在某些應(yīng)用場(chǎng)景的性能大幅下降溜宽。重新啟用是勢(shì)在必行。
在 chrome 92 之前铅祸, chrome 是默認(rèn)開啟 SAB 的坑质,但是已經(jīng)彈出警告信息提示 SAB 將會(huì)在 92 版本必須啟用以下選項(xiàng):
# COEP 跨域嵌入策略,會(huì)阻止頁面加載任何未明確授予文檔許可權(quán)的跨域資源(使用CORP或CORS)临梗。
Cross-Origin-Embedder-Policy: require-corp
# COOP
Cross-Origin-Opener-Policy: same-origin
也就是說加載的資源必須有 corp 策略的頭信息涡扼, 跨域打開者也是同域名
相關(guān)資料
- 關(guān)于 SharedArrayBuffer spectre 攻擊的討論
https://github.com/tc39/security/issues/3 - 使用 SharedArrayBuffer 進(jìn)行 Spectre 攻擊的原理
https://www.giantbranch.cn/2018/01/09/%E8%85%BE%E8%AE%AF%E7%8E%84%E6%AD%A6%E5%AE%9E%E9%AA%8C%E5%AE%A4%E6%A3%80%E6%B5%8B%E6%B5%8F%E8%A7%88%E5%99%A8spectre%E7%9A%84%E5%8E%9F%E7%90%86/ - 為什么需要“跨域隔離”才能獲得強(qiáng)大的功能
- Same origin : https://web.dev/same-origin-policy/
- 跨域隔離啟用指南: https://web.dev/cross-origin-isolation-guide/
- https://v8.dev/blog/spectre
- https://web.dev/coop-coep/
- https://www.cnblogs.com/Shepherdzhao/p/8253421.html