同源政策學(xué)習(xí)筆記

來自:阮一峰:瀏覽器同源政策及其規(guī)避方法

  • 同源政策由網(wǎng)景公司引入瀏覽器虹蒋,目前所有瀏覽器都實(shí)行這個(gè)政策飒货。
  • 同源指“三個(gè)相同”:
  1. 協(xié)議相同
  2. 域名相同
  3. 端口相同
  • 非同源有三種行為受限制:
  1. Cookie魄衅、LocalStorage和IndexDB無法讀忍粮ā;
  2. DOM無法獲得
  3. AJAX請(qǐng)求不能發(fā)送
  • 同源政策保護(hù)了用戶信息安全莫辨,防止惡意網(wǎng)絡(luò)竊取數(shù)據(jù)傲茄,是必要的沮榜,但有時(shí)也會(huì)影響合理用途,所以有時(shí)可以采取規(guī)避方法:
  1. 兩個(gè)網(wǎng)頁一級(jí)域名相同蟆融,只是二級(jí)域名不同草巡,瀏覽器允許通過設(shè)置document.domain共享Cookie型酥。

例如,A網(wǎng)頁是http://w1.example.com/a.html弥喉,B網(wǎng)頁是http://w2.example.com/b.html郁竟,設(shè)置相同document.domain
document.domain = 'example.com';
A網(wǎng)頁通過腳本設(shè)置一個(gè)Cookie
document.cookie = "test1=hello";
B網(wǎng)頁就可以讀到這個(gè)Cookie

  • 注意由境,該方法只適用于Cookie和iframe窗口蓖议,LocalStorage和IndexDB不行。

另外讥蟆,也可以指定Cookie的所屬域名為一級(jí)域名,這樣二瘸彤、三級(jí)域名不做設(shè)置都可以讀取這個(gè)Cookie:
Set-Cookie: key=value;domain=.example.com;path=/

  1. 對(duì)于完全不同源的網(wǎng)站修然,目前有三種方法解決跨域窗口的通信問題:
    i. 片段識(shí)別符(fragment identifier)
    ii. window.name
    iii. 跨文檔通信API(Cross-document messaging)
    2.1 片段識(shí)別符是URL#號(hào)后面的部分质况,只改變片段識(shí)別符,頁面不會(huì)刷新拯杠。
// 父窗口把信息寫入子窗口的片段識(shí)別符
var src = originURL + '#' +data;
document.getElementById('myIFrame').src = src;
// 子窗口通過監(jiān)聽hashchange事件得到通知
window.onhashchange = checkMessage;
function checkMessage() {
  var message  = window.location.hash;
  //...
}
// 同樣子窗口也可以改變父窗口的片段識(shí)別符
parent.location.href = target + "#" +hash;

2.2 瀏覽器窗口有window.name屬性,特點(diǎn)是無論是否同源潭陪,只要在同一個(gè)窗口雄妥,前一個(gè)網(wǎng)頁設(shè)置了該屬性依溯,后一個(gè)網(wǎng)頁就可以讀取它老厌。

// 父窗口

2.3 HTML5引入一個(gè)新的API:跨文檔通信API(Cross-document messaging)黎炉。這個(gè)API為window對(duì)象新增一個(gè)window.postMessage方法,允許跨窗口通信慷嗜,不論這兩個(gè)窗口是否同源淀弹。

// 父窗口打開一個(gè)子窗口
var popup = window.open('http://bbb.com','title');
// 父窗口向子窗口發(fā)消息
popup.postMessage('Hello Worlad!','http://bbb.com');

postMessage方法的第一個(gè)參數(shù)是具體的信息內(nèi)容庆械,第二個(gè)參數(shù)是接收消息的窗口的源(origin),即“協(xié)議+域名+端口”缭乘,也可以設(shè)為“*”沐序,表示不限域名堕绩,向所有窗口發(fā)送。

// 子窗口向父窗口發(fā)消息也類似
window.opener.postMessage('Hi!','http://aaa.com');
// 父窗口和子窗口都可以通過message事件監(jiān)聽對(duì)方消息
window.addEventListener('message',function(e) {
  console.log(e.data)
},false)// 默認(rèn)false奴紧,false表示句柄在冒泡階段執(zhí)行特姐,true表示句柄在捕獲階段執(zhí)行绰寞。

message事件的參數(shù)是事件對(duì)象event铣口,提供三個(gè)屬性:
i. event.source:發(fā)送消息的窗口
ii. event.origin:消息發(fā)向的窗口
iii. event.data:消息內(nèi)容

  • AJAX
    同源政策滤钱,AJAX請(qǐng)求只能發(fā)給同源網(wǎng)址觉壶,否則報(bào)錯(cuò)递惋。
    除了架設(shè)服務(wù)器代理(瀏覽器請(qǐng)求同源服務(wù)器阐污,再由后者請(qǐng)求外部服務(wù)),有三種方法規(guī)避這個(gè)限制:
    i. JSONP
    ii. WebSocket
    iii. CORS
  1. JSONP
    JSONP是服務(wù)器與客戶端跨源通信的常用方法争剿,簡(jiǎn)單適用痊末,老瀏覽器也支持蚕苇。
    基本思想是凿叠,通過<script>向服務(wù)器請(qǐng)求JSONP數(shù)據(jù),不受同源政策限制盒件;服務(wù)器受到請(qǐng)求后蹬碧,將數(shù)據(jù)放在指定名字的回調(diào)函數(shù)傳回來炒刁。
    首先,網(wǎng)頁動(dòng)態(tài)插入<script>元素翔始,向跨源網(wǎng)址發(fā)出請(qǐng)求罗心。
function addScriptTag(src) {
  var script = document.createElement('script')
  script.setAttribute('type','text/javascript')// 添加屬性(屬性名城瞎,屬性值)
  script.src = src
  document.body.appendChild(script)
}
window.onload = function() {
  addScriptTag('http://example.com/ip?callback=foo')
}
function foo(data) {
  console.log('Your public IP address is: ' + data.ip)
}
  1. WebSocket
    WebSocket是通信協(xié)議,協(xié)議前綴有ws://(非加密)和wss://(加密)全谤,不實(shí)行同源政策肤晓,可以跨源通信认然。
  2. CORS
    CORS(Cross-Origin Resource Sharing)补憾,跨源資源分享卷员,是W3C標(biāo)準(zhǔn),屬于跨源AJAX請(qǐng)求的根本解決方法毕骡。JSONP只能發(fā)GET請(qǐng)求削饵,CORS允許任何類型請(qǐng)求。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窿撬,一起剝皮案震驚了整個(gè)濱河市启昧,隨后出現(xiàn)的幾起案子劈伴,更是在濱河造成了極大的恐慌,老刑警劉巖跛璧,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異追城,居然都是意外死亡刹碾,警方通過查閱死者的電腦和手機(jī)座柱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辆布,“玉大人瞬矩,你說我怎么就攤上這事锋玲【坝茫” “怎么了惭蹂?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盾碗。 經(jīng)常有香客問我媚污,道長(zhǎng)廷雅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任航缀,我火速辦了婚禮商架,結(jié)果婚禮上芥玉,老公的妹妹穿的比我還像新娘。我一直安慰自己灿巧,他們只是感情好赶袄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饿肺,像睡著了一般蒋困。 火紅的嫁衣襯著肌膚如雪唬格。 梳的紋絲不亂的頭發(fā)上家破,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天购岗,我揣著相機(jī)與錄音,去河邊找鬼喊积。 笑死,一個(gè)胖子當(dāng)著我的面吹牛玄妈,可吹牛的內(nèi)容都是我干的乾吻。 我是一名探鬼主播拟蜻,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酝锅!你這毒婦竟也來了诡必?” 一聲冷哼從身側(cè)響起搔扁,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稿蹲,沒想到半個(gè)月后扭勉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苛聘,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年设哗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唱捣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熬拒。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖澎粟,靈堂內(nèi)的尸體忽然破棺而出蛀序,到底是詐尸還是另有隱情,我是刑警寧澤徐裸,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布遣鼓,位于F島的核電站重贺,受9級(jí)特大地震影響骑祟,放射性物質(zhì)發(fā)生泄漏气笙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一潜圃、第九天 我趴在偏房一處隱蔽的房頂上張望缸棵。 院中可真熱鬧谭期,春花似錦堵第、人聲如沸隧出。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽针余。三九已至,卻和暖如春涵紊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幔摸。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留既忆,地道東北人驱负。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓患雇,卻偏偏與公主長(zhǎng)得像跃脊,于是被迫代替她去往敵國和親苛吱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容