CORS 簡介
由于SOP
限制了很多跨域的業(yè)務(wù)場景寸齐,于是尋求某種技術(shù)來實現(xiàn)跨域的資源訪問。而JSONP
就是其中的代表抄谐,可JSONP
只是程序員想到的一種編碼技術(shù)渺鹦,并非在協(xié)議層面解決跨域問題,從而容易出現(xiàn)種種問題蛹含。為了更安全的跨域資源訪問毅厚,于是有了CORS (Cross-Origin Resource Sharing 跨域資源共享)
誕生。
如何提供安全的跨域資源訪問是CORS
要解決的問題浦箱。CORS
使用檢查請求頭部的相關(guān)字段和服務(wù)端配置的規(guī)則進行對比吸耿,來選擇是否允許跨域。(個人理解就像協(xié)議一般規(guī)定好了一定規(guī)則酷窥,滿足了才可以跨域,否則不允許跨域)。但凡是要配置規(guī)則的程序糕珊,難免會出現(xiàn)一些意外,就像很多程序員寫不出恰當(dāng)?shù)恼齽t一樣喇肋。CORS
也不例外糊渊,當(dāng)服務(wù)端配置的規(guī)則不夠合理渺绒,導(dǎo)致非同域的資源可以互相訪問宗兼,CORS
反而使SOP
的保護機制土崩瓦解殷绍。
因此,CORS
漏洞成因很明顯登钥,服務(wù)端配置的規(guī)則不當(dāng)所導(dǎo)致的。
CORS如何實現(xiàn)跨域
服務(wù)端會配置了Access-Control-Allow-Origin
頭塔鳍,當(dāng)瀏覽器發(fā)送數(shù)據(jù)包時,瀏覽器會自動加上Origin
字段并且和服務(wù)端進行比對掌唾,如果為預(yù)期犀斋,那么允許接收览效,否則瀏覽器會因為同源策略而不接收锤灿。
服務(wù)端配置代碼如下所示:
header("Access-Control-Allow-Origin:http://www.baidu.com");
header("Access-Control-Allow-Credentials:true");
當(dāng)瀏覽器發(fā)送的請求包中Origin
頭部為www.baidu.com
時螃诅,則會允許讀取該域的資源并且第二行表示可以帶上cookie
去訪問,否則則拒絕袭艺。當(dāng)然可以更加靈活的配置升敲,比如舉個例子如下驴党,
header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Credentials:true");
眾所周知设江,*
是通配符的意思,那么這樣就變成任意域名都可以讀取這個域的資源并且還會帶上cookie
,顯然不符合SOP
的要求,所以瀏覽器是不允許這樣的配置存在。這個例子比較極端腺晾,只是想表述归形,當(dāng)配置不當(dāng)則會導(dǎo)致惡意的域可以訪問目標域的資源蕉世,從而導(dǎo)致信息泄露。
修復(fù)方式
既然是配置問題哩至,那么就嚴格檢查配置是否合理,配置合理的情況下蜜自,這個問題是避免的菩貌。
參考鏈接
由于比較懶,沒有自己動手寫個小示例重荠,網(wǎng)上找了個鏈接我覺得講解的很好箭阶,也有相應(yīng)的示例。還有有些參考文章還涉及到了簡單請求和復(fù)雜請求的知識戈鲁,但個人覺得對理解CORS
的問題仇参,只需搞明白幾個字段就大致OK了,至于再深入一下多學(xué)習(xí)一些也是沒毛病的婆殿。
簡單請求和非簡單請求
CORS跨域?qū)W習(xí)诈乒,有實例