CORS 跨域工作機制與安全防范
隨著前后端分離架構的逐漸普及,CORS跨域技術被廣泛應用在Web應用中,以便不同域之間資源的互相訪問。
一、CORS工作機制詳解
CORS的全稱是跨域資源共享(Cross-Origin Resource Sharing),允許瀏覽器向跨域服務器發(fā)起XMLHttpRequest請求。主要機制分為兩種調用流程:
1、簡單請求
瀏覽器直接發(fā)出實際請求,無需預檢。簡單請求滿足以下條件:
- 使用下列方法之一:GET、HEAD、POST
- 只能設置以下頭部:Accept、Accept-Language、Content-Language、Content-Type(只限于application/x-www-form-urlencoded、multipart/form-data、text/plain三種類型)
如果滿足這兩個條件,瀏覽器會自動在請求頭中添加 Origin 字段,發(fā)起簡單請求,服務器根據(jù) Origin 劃定的來源域,決定是否給予響應。
2、預檢請求
如果不滿足簡單請求的條件,瀏覽器會自動發(fā)起預檢請求(OPTIONS 請求),詢問服務器請求是否被允許。如:
- 瀏覽器發(fā)送 OPTIONS 請求,請求頭中包含 Origin、Access-Control-Request-Method 和 Access-Control-Request-Headers 等信息
- 服務器響應 OPTIONS 請求,響應頭中包含 Access-Control-Allow-Origin、Access-Control-Allow-Methods 和 Access-Control-Allow-Headers 等信息
- 瀏覽器對響應頭信息進行確認和緩存
- 瀏覽器發(fā)送實際請求。請求頭中自動添加 Origin 字段。
- 服務器進行 Access-Control-Allow-Origin 校驗,并響應實際請求
二、CORS安全風險詳解
CORS 的機制有一定復雜性,也會有藏著一些安全風險。主要包括:
1、CORS誤配置風險
如果服務器端CORS配置錯誤,可能會使得本不應該訪問的惡意網(wǎng)站得到數(shù)據(jù)訪問權限。這屬于典型的CORS誤配置問題。
2、CSRF跨站請求偽造風險
攻擊者可利用CORS實現(xiàn)CSRF攻擊。例如惡意網(wǎng)站利用CORS請求接口獲取用戶數(shù)據(jù)或執(zhí)行增刪改操作。這屬于利用CORS實現(xiàn)CSRF攻擊的風險。
3、信息泄露風險
攻擊者可以利用CORS的一些特性獲取敏感信息。例如根據(jù)CORS頭部判斷網(wǎng)站架構,根據(jù)錯誤信息判斷后臺技術棧等。
4、報文劫持風險
攻擊者可在客戶端通過JS劫持CORS報文,改變請求參數(shù)、添加非法頭部甚至修改響應內容。這屬于CORS請求被劫持的風險。
5、瀏覽器緩存被污染風險
惡意網(wǎng)站可向有緩存的CORS接口大量發(fā)送預檢請求,導致瀏覽器緩存被其預檢選項所污染,進而影響其他正常CORS請求。
三、防范策略
防范CORS風險的關鍵在于從源頭加強接口訪問控制,嚴格限制允許跨域請求的來源,具體策略包括:
- 嚴格限制允許跨域請求的源(Origin)。生產環(huán)境一般只允許指定的域名請求,不開放。
- 對安全性要求高的接口,禁用CORS跨域訪問。敏感接口不允許異域調用。
- 驗證Origin請求頭防止它被欺騙。攻擊者可能偽造這個字段。
- 使用CSRF防護機制,比如校驗HTTP Referer 或在請求中設置token進行校驗。
- 接口響應中避免返回敏感信息。對錯誤信息進行遮蔽處理。
- 在服務端校驗CORS的請求頭,防止其被客戶端篡改。
- 對跨域預檢請求的緩存時長、次數(shù)/頻率進行限制。
- 使用CSP防護CORS跨域請求遭到劫持的風險。
- 啟用服務器端的CORS中間件,規(guī)范CORS的實現(xiàn)。
CORS作為一個具有明確邊界訪問控制的跨域解決方案,應嚴格限制在業(yè)務必需的場景中使用。在啟用CORS的基礎上,采取必要的安全防護措施,以降低相關風險。