跨域請(qǐng)求CORS

瀏覽器默認(rèn)是不允許XMLHttpRequest(ajax)發(fā)送請(qǐng)求到其他網(wǎng)站(跨域)的,
比如a網(wǎng)站的javascript想要從b網(wǎng)站獲取數(shù)據(jù)時(shí)就會(huì)被瀏覽器攔截。這也是為了安全考慮,如果不做限制的話(huà),
a網(wǎng)站的js 請(qǐng)求b網(wǎng)站時(shí)默認(rèn)會(huì)把b網(wǎng)站的cookie帶上,a網(wǎng)站就可以以b網(wǎng)站的登錄信息(b網(wǎng)站的cookie)去攻擊b網(wǎng)站。

但是實(shí)際應(yīng)用中,有時(shí)候確實(shí)需要跨域請(qǐng)求的,跨源資源共享 (CORS)就是用來(lái)解決實(shí)現(xiàn)這種功能的。
CORS是http協(xié)議的一部分,需要瀏覽器和web服務(wù)器共同支持,目前絕大多數(shù)的瀏覽器和服務(wù)器都已支持。

CORS把請(qǐng)求分成兩類(lèi),簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求

簡(jiǎn)單請(qǐng)求:

同時(shí)滿(mǎn)足下面兩個(gè)條件就是簡(jiǎn)單請(qǐng)求

(1) 請(qǐng)求方法是以下三種方法之一:
HEAD
GET
POST
(2)HTTP的頭信息不超出以下幾種字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三個(gè)值application/x-www-form-urlencoded、multipart/form-data、text/plain

簡(jiǎn)單請(qǐng)求過(guò)程如上圖,步驟為:
1.瀏覽器發(fā)現(xiàn)ajax的請(qǐng)求時(shí)跨域的,會(huì)在請(qǐng)求頭里面添加一個(gè)origin字段,值為當(dāng)前域地址(不包含路徑)。

2.服務(wù)器拿到請(qǐng)求后會(huì)正常處理請(qǐng)求,然后再檢查請(qǐng)求的頭,發(fā)現(xiàn)origin,就知道這是跨域的請(qǐng)求,會(huì)檢查origin的域名是否在服務(wù)器的許可列表里,如國(guó)在就在響應(yīng)頭添加一個(gè)Access-Control-Allow-Origin字段,值就是origin的值。如果不在就不設(shè)置Access-Control-Allow-Origin這個(gè)頭。然后返回相應(yīng)

3.瀏覽器收到響應(yīng),知道這是個(gè)跨域的響應(yīng),檢查響應(yīng)頭里是否有Access-Control-Allow-Origin,如果沒(méi)有就立即報(bào)錯(cuò)并停止執(zhí)行ajax的代碼,如果有,并且值為自己的域名,或者為通配符*,就正常處理。

注意在這種簡(jiǎn)單請(qǐng)求里,瀏覽器會(huì)正常發(fā)送請(qǐng)求的,服務(wù)器也會(huì)正常處理請(qǐng)求,唯一可能被攔截的就是最后瀏覽器收到響應(yīng)后是否會(huì)處理,如果沒(méi)有Access-Control-Allow-Origin這個(gè)頭信息,就會(huì)停止處理。所以這個(gè)過(guò)程請(qǐng)求響應(yīng)一定還是會(huì)被處理的。

非簡(jiǎn)單請(qǐng)求

如果請(qǐng)求不符合簡(jiǎn)單請(qǐng)求的條件,就是非簡(jiǎn)單請(qǐng)求。這種請(qǐng)求一般會(huì)修改服務(wù)器上的資源,所以處理上比較嚴(yán)格。



非簡(jiǎn)單請(qǐng)求過(guò)程如上圖,步驟為:

  1. 瀏覽器發(fā)現(xiàn)ajax的請(qǐng)求是跨域的,并且是非簡(jiǎn)單請(qǐng)求,為了服務(wù)器的安全,不會(huì)像簡(jiǎn)單請(qǐng)求一樣直接發(fā)送請(qǐng)求,而是會(huì)先發(fā)送一個(gè)OPTIONS的請(qǐng)求給服務(wù)器,詢(xún)問(wèn)服務(wù)器網(wǎng)頁(yè)所在的域名是否在服務(wù)器的許可名單之中,以及可以使用哪些HTTP動(dòng)詞和頭信息字段。只有得到肯定答復(fù),瀏覽器才會(huì)發(fā)出正式的XMLHttpRequest請(qǐng)求,否則就報(bào)錯(cuò),這個(gè)請(qǐng)求里也會(huì)有origin頭信息。

2.服務(wù)器收到"預(yù)檢"請(qǐng)求以后,檢查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,確認(rèn)允許跨源請(qǐng)求,就可以做出回應(yīng)

3.瀏覽器收到服務(wù)器的“預(yù)檢請(qǐng)求”響應(yīng)后,檢查頭信息里的Access-Control-Allow-Origin字段,如果為當(dāng)前的域名或者為通配符*, 則知道這個(gè)跨域請(qǐng)求可以進(jìn)行,就會(huì)正常發(fā)送用戶(hù)的請(qǐng)求,否則為不可進(jìn)行,攔截用戶(hù)的請(qǐng)求

從上面的過(guò)程可以看到,無(wú)論是簡(jiǎn)單還是非簡(jiǎn)單請(qǐng)求,CORS的過(guò)程都需要服務(wù)端和瀏覽器共同配合,
請(qǐng)求只要通過(guò)了瀏覽器的驗(yàn)證,服務(wù)器總是會(huì)正常處理。所以如果我們使用代碼怕蟲(chóng)來(lái)發(fā)送請(qǐng)求,就不會(huì)有跨域請(qǐng)求的問(wèn)題,總能成功。

另外注意到,簡(jiǎn)單請(qǐng)求服務(wù)器總是會(huì)處理,攔截只發(fā)生在瀏覽器處理服務(wù)器響應(yīng)過(guò)程中,在chrome的network里還是可以看到服務(wù)器返回的正常數(shù)據(jù),并且響應(yīng)碼200正常。這就警示我們,不要在簡(jiǎn)單類(lèi)型的請(qǐng)求里更新重要數(shù)據(jù),否則跨站cookie攻擊漏洞就會(huì)發(fā)生。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前沿: 最近總聽(tīng)到同事聊跨域得問(wèn)題,于是自己抽空仔細(xì)的查閱了一下關(guān)于跨域的知識(shí)。說(shuō)到跨域,就得提到同源,跨域是指一...
    戈弋圖閱讀 1,927評(píng)論 0 4
  • 前端開(kāi)發(fā)的童鞋,應(yīng)該都有聽(tīng)過(guò)跨域請(qǐng)求,但這其中的細(xì)節(jié)可能還不清楚,比如: 什么是跨域請(qǐng)求? 為什么會(huì)存在跨域請(qǐng)求?...
    smallmuou閱讀 2,359評(píng)論 0 2
  • cors 內(nèi)容回顧:restful 規(guī)范10個(gè) 除了 jsonp(它只可以發(fā) get 請(qǐng)求), 還有cors(可以...
    Ugfly閱讀 4,091評(píng)論 0 0
  • OPTIONS 方法比較少見(jiàn),該方法用于請(qǐng)求服務(wù)器告知其支持哪些其他的功能和方法。通過(guò) OPTIONS 方法,可以...
    elef閱讀 2,545評(píng)論 0 0
  • 第一步:創(chuàng)建允許跨域的中間件 第二步:加入以下加上請(qǐng)求頭代碼 第三步:在Kernel中注冊(cè) 補(bǔ)充: 1.在第三步中...
    走在路上的低級(jí)弟弟閱讀 5,121評(píng)論 0 2

友情鏈接更多精彩內(nèi)容