前端瀏覽器同源策略 2019-08-11

原文參考:http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html

同源"指的是"三個相同"

  • 協(xié)議相同
  • 域名相同
  • 端口相同

三種行為受到限制

  • Cookie萎馅、LocalStorage 和 IndexDB 無法讀取。
  • DOM 無法獲得虹蒋。
  • AJAX 請求不能發(fā)送糜芳。

規(guī)避限制

Cookie

  • 兩個網(wǎng)頁一級域名相同,只是二級域名不同魄衅,瀏覽器允許通過設(shè)置document.domain共享 Cookie
a: http://w1.example.com/a.html
b: http://w2.example.com/b.html
//A網(wǎng)頁通過腳本設(shè)置一個 Cookie耍目。
document.domain = 'example.com';
//B網(wǎng)頁就可以讀到這個 Cookie。
var allCookie = document.cookie;
  • 服務(wù)器也可以在設(shè)置Cookie的時候徐绑,指定Cookie的所屬域名為一級域名邪驮,比如.example.com
Set-Cookie: key=value; domain=.example.com; path=/
這樣的話傲茄,二級域名和三級域名不用做任何設(shè)置毅访,都可以讀取這個Cookie。

iframe

如果兩個網(wǎng)頁不同源盘榨,就無法拿到對方的DOM喻粹。典型的例子是iframe窗口和window.open方法打開的窗口,它們與父窗口無法通信草巡。

如果兩個窗口一級域名相同守呜,只是二級域名不同,那么設(shè)置上一節(jié)介紹的document.domain屬性,就可以規(guī)避同源政策查乒,拿到DOM弥喉。

完全不同源的網(wǎng)站,目前有三種方法玛迄,可以解決跨域窗口的通信問題

  • 片段識別符(fragment identifier)
  • window.name
  • 跨文檔通信API(Cross-document messaging)

前面兩種比較low參見原文

跨文檔通信API (window.postMessage)

發(fā)送:

popup.postMessage('Hello World!', 'http://bbb.com');
  • 第一個參數(shù)是具體的信息內(nèi)容由境,
  • 第二個參數(shù)是接收消息的窗口的源(origin),即"協(xié)議 + 域名 + 端口"蓖议。
    1. 也可以設(shè)為*虏杰,表示不限制域名,向所有窗口發(fā)送
    1. 設(shè)置為/勒虾,向所有同源窗口發(fā)送

接收:

window.addEventListener('message', function(e) {
  console.log(e.data);
},false);

event纺阔,提供以下三個屬性。

  • event.source:發(fā)送消息的窗口
  • event.origin: 消息來源的網(wǎng)址
  • event.data: 消息內(nèi)容

AJAX

同源政策規(guī)定修然,AJAX請求只能發(fā)給同源的網(wǎng)址笛钝,否則就報錯。

除了架設(shè)服務(wù)器代理(瀏覽器請求同源服務(wù)器低零,再由后者請求外部服務(wù))婆翔,有三種方法規(guī)避這個限制。

  • JSONP
  • WebSocket
  • CORS

JSONP

它的基本思想是掏婶,網(wǎng)頁通過添加一個<script>元素啃奴,向服務(wù)器請求JSON數(shù)據(jù),這種做法不受同源政策限制雄妥;服務(wù)器收到請求后最蕾,將數(shù)據(jù)放在一個指定名字的回調(diào)函數(shù)里傳回來。

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);
};

WebSocket

該協(xié)議不實行同源政策老厌,只要服務(wù)器支持瘟则,就可以通過它進(jìn)行跨源通信。

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

上面代碼中枝秤,有一個字段是Origin醋拧,表示該請求的請求源(origin),即發(fā)自哪個域名淀弹。
正是因為有了Origin這個字段丹壕,所以WebSocket才沒有實行同源政策。因為服務(wù)器可以根據(jù)這個字段薇溃,判斷是否許可本次通信菌赖。如果該域名在白名單內(nèi),服務(wù)器就會做出如下回應(yīng)沐序。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琉用,一起剝皮案震驚了整個濱河市堕绩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邑时,老刑警劉巖奴紧,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刁愿,居然都是意外死亡绰寞,警方通過查閱死者的電腦和手機到逊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門铣口,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人觉壶,你說我怎么就攤上這事脑题。” “怎么了铜靶?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵叔遂,是天一觀的道長。 經(jīng)常有香客問我争剿,道長已艰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任蚕苇,我火速辦了婚禮哩掺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涩笤。我一直安慰自己嚼吞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布蹬碧。 她就那樣靜靜地躺著舱禽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恩沽。 梳的紋絲不亂的頭發(fā)上誊稚,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音罗心,去河邊找鬼里伯。 笑死,一個胖子當(dāng)著我的面吹牛协屡,可吹牛的內(nèi)容都是我干的俏脊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼肤晓,長吁一口氣:“原來是場噩夢啊……” “哼爷贫!你這毒婦竟也來了认然?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤漫萄,失蹤者是張志新(化名)和其女友劉穎卷员,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腾务,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡毕骡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岩瘦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片未巫。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖启昧,靈堂內(nèi)的尸體忽然破棺而出叙凡,到底是詐尸還是另有隱情,我是刑警寧澤密末,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布握爷,位于F島的核電站,受9級特大地震影響严里,放射性物質(zhì)發(fā)生泄漏新啼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一刹碾、第九天 我趴在偏房一處隱蔽的房頂上張望燥撞。 院中可真熱鬧,春花似錦教硫、人聲如沸叨吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茶鉴。三九已至,卻和暖如春景用,著一層夾襖步出監(jiān)牢的瞬間涵叮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工伞插, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留割粮,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓媚污,卻偏偏與公主長得像舀瓢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耗美,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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