September 18, 2023

Viiisit [Information Security] - CORS!

#infosec

before_action :about_same_origin_policy

在講述 CORS(Cross-Origin Resource Sharing 跨來源資源共享)之前,
我們必須了解 Same-Origin Policy (同源政策),Let’s go!

Same-Origin Policy 同源政策

Same-Origin Policy (同源政策) 是一種網頁瀏覽器安全機制,
用於保護網頁內容的安全性和隱私性。
這一政策旨在防止惡意網站從瀏覽器中訪問或修改其他網站的數據。
網頁上的腳本只能與其自身來源的資源進行交互,而不能直接訪問其他來源的資源。

同源政策重點:

同源政策是基本的保護機制,讓不同源的網站無法存取到資源和資料,
有助於確保網頁內容的安全性,防止潛在的攻擊和數據泄露。
開發者需理解同源政策,並在開發網頁應用程序時遵守此政策,以確保應用程序的安全性和穩定性。

What is CORS?

已經了解同源政策之後,在實務開發上,幾乎無法避免去請求非同源的資源。
在有同源政策的情況下,要怎麼做到非同源請求?
這時候就是要透過 CORS(Cross-Origin Resource Sharing 跨來源資源共享) 啦!

CORS(Cross-Origin Resource Sharing 跨來源資源共享)是一種瀏覽器安全機制,
允許網頁應用程序在不同源(不同域名、協議或端口號)之間進行跨源 HTTP 請求。
CORS 通過特殊的 HTTP 標頭允許或拒絕瀏覽器向其他源發送請求,以確保安全性和隱私。
開發者可以配置伺服器以指定哪些來源可以訪問其資源,從而避免潛在的安全風險,同時實現跨源通信。這對於網頁應用程序與外部 API 或資源進行互動非常重要。

CORS 問題是什麼?

CORS(Cross-Origin Resource Sharing)問題是一種網頁安全問題,當網頁或瀏覽器在一個網域中請求來自另一個網域的資源時,可能會遇到的限制和安全機制。
簡而言之,他涉及當前網頁的來源(域名、協議、端口)與要請求的資源的來源不匹配時,瀏覽器會阻止這種跨源請求,以保護用戶的安全和隱私。

CORS 問題通常發生在 JavaScript 發起的跨源 HTTP 請求(例如 Ajax 請求)
或在 <img><script><link> 等元素載入外部資源時。

解決CORS問題 - 修改伺服器設定以允許跨源請求、使用代理伺服器、或使用 JSONP 等技術。

CORS問題的存在是為了防止潛在的安全漏洞,例如跨站請求偽造(CSRF)和跨站點腳本攻擊(XSS)。
通過實行同源政策和 CORS,瀏覽器可以確保網頁應用程序只能訪問受信任的來源,以減少潛在的風險。


回顧當初在使用 jspdf 套件,進行 pdf 轉檔功能時,
使用 Base64 編碼解決 jspdftoDataURL() 方法的錯誤,
此種方式可以視為解決 CORS 問題的一種方法,特別是當你在網頁中處理圖像或資源。

通常,當你使用 toDataURL() 方法將畫布內容轉換為 DataURL 時,
該 DataURL 包含對畫布上的圖像或資源的引用。
如果這些圖像或資源來自不同的源(例如,不同的域名),並且該源未設置 CORS 支持,則在使用 toDataURL() 時可能會觸發 CORS 錯誤,因為該操作被視為跨源請求。

通過將圖像或資源的 URL 轉換為 Base64 編碼,然後使用 Base64 編碼的資料 URL 嵌入到網頁中,可以避免 CORS(跨來源資源共享)問題。
這是因為該資源不再是通過瀏覽器的 HTTP 請求來載入的,瀏覽器不需要發出跨域請求來獲取圖像,而是直接內嵌在網頁中,因此不需要跨源請求,也不受同源政策的限制。

設置 CORS 標頭是一種解決 CORS 問題的方法,但它要求你有控制權限的伺服器,能夠配置伺服器以允許跨源請求。
然而,如果你無法控制來源伺服器或無法更改其 CORS 設置,那麼使用 Base64 編碼是一種繞過 CORS 問題的有效方法,因為資源是在網頁內部處理的,不需要跨源請求的許可權。


參考資料:
CORS 是什麼? 為什麼要有 CORS?