一、cors本質
cors (跨源資源共享) 是一種認證機制,是 w3c (全球資訊網聯盟) 推薦的一種用於跨域資源訪問的安全策略。
二、源與同源策略
cors 中的源指的是某個url中的協議、網域名稱和埠,由這三個元素標識乙個唯一的源,如 http://localhost:8080 和 https://localhost:8000 是不同的源,因為它們的協議和埠都不同。
源也可以寬泛地理解為乙個 web站點,通常我們訪問乙個**的時候,載入的靜態資源通常都是站內的。
簡單請求的傳送http頭當中要求總是包含乙個域(origin)的資訊。該域包含協議名、位址以及乙個可選的埠。不過這一項實際上由瀏覽器代為傳送,並不是開發者**可以觸及到的。(疑問沒搞清楚的情況:簡單請求下,谷歌瀏覽器頭部有些時候會自動填充origin欄位有時候不會填充)
簡單請求的部分響應頭:access-control-allow-origin(必含)、access-control-allow-credentials(可選)access-control-expose-headers(可選)。
2、複雜請求
任何乙個不滿足上述要求的請求,即被認為是複雜請求。乙個複雜請求不僅有包含通訊內容的請求,同時也包含預請求,以options形式傳送,此時作為服務端,也需要返回"預回應"作為響應。預請求實際上是對服務端的一種許可權請求,只有當預請求成功返回,實際請求才開始執行。
四、實現cors相關的幾個header
origin
當瀏覽器檢測到某個請求要訪問跨域資源時,會在請求頭中加上origin,origin 通常就是從 referer 欄位中擷取協議、網域名稱和埠相關的資訊,用於表示請求的**站點,用來說明請求從**發起的,包括,且僅僅包括協議和網域名稱。這個引數一般只存在於cors跨域請求中,可以看到response有對應的header:access-control-allow-origin。
referer
告知伺服器請求的原始資源的uri,其用於所有型別的請求,並且包括:協議+網域名稱+查詢引數(注意,不包含錨點資訊)。因為原始的uri中的查詢引數可能包含id或密碼等敏感資訊,如果寫入referer,則可能導致資訊洩露。
access-control-allow-origin
如果伺服器支援cors的話,會在響應頭中加上這個字段,表示伺服器信任的源,當值為 "*"時,表示伺服器的資源信任所有的源;瀏覽器發起cors請求後也會檢查這個字段,如果響應頭中沒有這個字段或者不信任源,都會在控制台報錯。
access-control-allow-methods
發起跨域請求時允許的http方法,由逗號分隔如get,options表示只能通過這些方法發起跨域請求,其他 delete,put,post等可能改變資源的方法會被拒絕
access-control-allow-credentials
該項標誌著請求當中是否包含cookies資訊,只有乙個可選值:true(必為小寫)。如果不包含cookies,請略去該項,而不是填寫false。
五、cors實現
從以上介紹的幾個cors相關的header也可以看出,cors的實現需要客戶端(瀏覽器)和服務端的協同配合:
1.瀏覽器要支援在發起跨域請求時附加 origin 頭,並在響應返回時檢查 access-control-allow-origin 等頭部,判斷服務端是否支援或允許該跨域請求。現代的瀏覽器基本都支援cors。
2.服務端要在響應中設定 access-control-allow-origin 等響應頭,表示自己支援cors,並宣告自己的安全策略。
六、關於cors的csrf攻擊流程
如put傳參(允許跨站):
觸發攻擊者csrf-----瀏覽器傳送options認證協議(瀏覽器帶上origin欄位自動填充為null)------伺服器返回(返回狀態碼200ok、access-control-allow-origin允許)------瀏覽器傳送put傳參內容
如put傳參(不允許跨站):
觸發攻擊者csrf-----瀏覽器傳送options認證協議(瀏覽器帶上origin欄位自動填充為null)------伺服器返回(返回非200ok或access-control-allow-origin不允許)------瀏覽器報錯不傳送put傳參內容
七、關於cors的csrf漏洞
1.對於簡單請求可直接構造csrf跨站;
2.對於其他傳參如delete、put、update等複雜請求,如服務端允許不同域訪問,及origin字段值為任意值,可構造csrf跨站;
3.可通過其他方式向瀏覽器安裝外掛程式或者利用瀏覽器某漏洞,將認證協議options返回欄位access-control-allow-origin篡改為*,騙過瀏覽器繞過驗證直接傳送請求包。
關於PEAP認證的過程說明
目錄 證書獲取 無線接入 認證初始化 建立tls通道 5 認證過程 客戶端通過開放系統接入的方法 open system 和ap之間建立好物理連線。1 client向ap裝置傳送乙個eapol start報文,開始802.1x接入的開始。2 ap向客戶端傳送eap request identity報...
CMMI3級認證過程記錄
工作這麼多年,搞了兩次cmmi 3級認證,趁現在還沒有全部忘記,先記錄下來。為什麼要評估cmmi?很簡單,公司的需要,能力的體現。cmmi 3級都有什麼?cmmi2級有7個過程域,cmmi 3級有7個過程域,要滿足3級認證,必須滿足2,3級所有過程域,所以一般都稱cmmi 3級有18個過程域。什麼叫...
憶龍2009 關於PEAP認證的過程說明
1 證書獲取 2 無線接入 客戶端通過開放系統接入的方法 open system 和ap之間建立好物理連線。3 認證初始化 1 client向ap裝置傳送乙個eapol start報文,開始802.1x接入的開始。2 ap向客戶端傳送eap request identity報文,要求客戶端將使用者資...