同源策略退敦、跨域

同源策略

1越驻、什么是源

以下面這段代碼為例

|http://www.iconfont.cn:80/home/index?spm=a313x.7781069.1998910419.2
  • http:// 是協(xié)議名
  • www.iconfont.cn 是域名
  • 80 是端口號叽掘,默認情況下不顯示楣铁,https協(xié)議下默認端口號是43,ftp協(xié)議下默認端口號是21
  • /home/index 是帶層次的文件路徑
  • spm=a313x.7781069.1998910419.2 是查詢字符段
  • 源(origin)就是指協(xié)議更扁、域名盖腕、端口號

2、什么是同源

  • 即地址里的協(xié)議浓镜、域名和端口號都相同溃列,則屬于同源

http://abc.efg.com/h/index.html為例做同源檢測有下表

url 結果 原因
http://abc.efg.com/h/demo.html 成功
http://abc.efg.com/j/index.html 成功
https://abc.efg.com/h/index.html 失敗 協(xié)議不相同
http://abc.efg.cn/h/index.html 失敗 域名不相同
http://abc.efg.com:8080/h/index.html 失敗 端口不相同

什么是同源策略

同源策略是一種約定,是瀏覽器最核心也是最基本的安全功能膛薛,主要體現(xiàn)在同源策略會限制來自不同源的文檔和腳本對當前源的文檔數(shù)據(jù)的讀取或設置某些屬性听隐,是用于隔離潛在惡意文件的重要安全機制

同源策略控制了不同源的交互,主要有三類交互

  • 跨域寫:通常允許哄啄,比如鏈接雅任、重定向表單提交(因為表單提交不需要反饋數(shù)據(jù))
  • 跨域資源嵌入:通常允許,下面會給出跨域資源嵌入的例子
  • 跨域讀:通常不允許咨跌,比如在使用XMLHttpRequest的時候會發(fā)生跨域問題沪么,不過通過某些方法仍可以進行跨域讀

注意:IE是例外

在同源策略中,Internet Explorer有兩點不同

  • 授信范圍(Trust Zones):兩個相互之間高度互信的域名锌半,如公司域名 (corporate domains)禽车,不遵守同源策略的限制。
  • 端口:未將端口號加入到同源策略的組成部分之中,因此 http://abc.com:81/index.htmlhttp://abc.com/index.html 屬于同源并且不受任何限制殉摔。

跨域

瀏覽器同源策略的機制的存在無法避免州胳,而我們實際應用中又不可避免的對于不同域要操作,那我們就只能跨域了

如何跨域

  • 降域 document.domain
http://a.bcd.com/index.html
http://b.bcd.com/index.html

上面兩個url雖然有個共同的bcd.com的一級域名逸月,二級域名卻不一樣陋葡,這樣的話同源策略也一樣不認為它倆是同源,對于這種情況彻采,我們可以將兩個頁面都設置document.domain='bcd.com'腐缤,這樣的話兩個頁面都可以互相訪問

  • 這個方式的特點

    • 只能在父域名與子域名之間使用,且將 域名設置為bcd.com后肛响,不能再設置為原先的域名岭粤。
    • 存在安全性問題,當一個站點被攻擊后特笋,另一個站點會引起安全漏洞剃浇。
    • 這種方法只適用于 Cookieiframe 窗口。
  • JSONP跨域
    JSONP和JSON并沒什么關系
    我們要知道一個概念即<script>里的src屬性是不受同源策略的影響的猎物,JSONP的原理就是利用這個機制來進行跨域虎囚,
    JSONP的原理:(舉例:a.com/jsonp.html想得到b.com/main.js中的數(shù)據(jù))在a.com的jsonp.html里創(chuàng)建一個回調(diào)函數(shù)xxx,動態(tài)添加<script>元素蔫磨,向服務器發(fā)送請求淘讥,請求地址后面加上查詢字符串,通過callback參數(shù)指定回調(diào)函數(shù)的名字堤如。請求地址為http://b.com/main.js?callback=xxx蒲列。在main.js中調(diào)用這個回調(diào)函數(shù)xxx,并且以JSON數(shù)據(jù)形式作為參數(shù)傳遞搀罢,完成回調(diào)蝗岖。我們來看看代碼:

  // a.com/jsonp.html中的代碼
  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://b.com/main.js?callback=foo');
  } //window.onload是為了讓頁面加載完成后再執(zhí)行
  function foo(data) { 
        console.log(data.name+"歡迎您");
  };


   //b.com/main.js中的代碼
   foo({name:"hl"})

JSONP跨域也有些問題存在

  • 使用這種方法,只要是個網(wǎng)站都可以拿到b.com里的數(shù)據(jù)榔至,存在安全性問題抵赢。需要網(wǎng)站雙方商議基礎token的身份驗證。
  • 只能是GET唧取,不能POST铅鲤。
  • 可能被注入惡意代碼,篡改頁面內(nèi)容兵怯,可以采用字符串過濾來規(guī)避此問題彩匕。
  • CORS
    CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)媒区,是一種ajax跨域 請求資源的方式驼仪,支持現(xiàn)代瀏覽器掸犬,支持IE10以上。實現(xiàn)的方式很簡單绪爸,當你使用XMLHttpRequest發(fā)送請求時湾碎,瀏覽器發(fā)現(xiàn)該請求不符合同源策略,會給該請求加一個請求頭:Origin奠货,后臺進行一系列處理介褥,如果確定接受請求則在返回的結果中加入一個響應頭:Access-Control-Allow-Origin;瀏覽器判斷響應頭中是否包含Origin的值,如果有則瀏覽器會處理響應递惋,我們就可以拿到響應數(shù)據(jù)柔滔,如果不包含瀏覽器直接駁回,這時我們無法拿到響應數(shù)據(jù)萍虽。所以睛廊,CORS的表象是讓你覺得他與同源的AJAX的請求沒啥區(qū)別,代碼完全一樣杉编。
    在剛才的例子中超全,在b.com里面添加響應頭聲明允許a.com的訪問,代碼如下
 Access-Control-Allow-Origin: http://a.com

這樣a.com就可以訪問b.com里面的數(shù)據(jù)了
注意:此方法IE8以下完全不支持邓馒,IE8以上部分支持嘶朱,具體參照caniuse
CORS詳細內(nèi)容請移步至阮老師-CORS詳解

  • 其它方式
    • HTML5的postMessage方法
    • window.name
    • location.hash
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市光酣,隨后出現(xiàn)的幾起案子疏遏,更是在濱河造成了極大的恐慌,老刑警劉巖挂疆,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件改览,死亡現(xiàn)場離奇詭異下翎,居然都是意外死亡缤言,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門视事,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胆萧,“玉大人,你說我怎么就攤上這事俐东〉耄” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵虏辫,是天一觀的道長蚌吸。 經(jīng)常有香客問我,道長砌庄,這世上最難降的妖魔是什么羹唠? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任奕枢,我火速辦了婚禮,結果婚禮上佩微,老公的妹妹穿的比我還像新娘缝彬。我一直安慰自己,他們只是感情好哺眯,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布谷浅。 她就那樣靜靜地躺著,像睡著了一般奶卓。 火紅的嫁衣襯著肌膚如雪一疯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天夺姑,我揣著相機與錄音违施,去河邊找鬼。 笑死瑟幕,一個胖子當著我的面吹牛磕蒲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播只盹,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辣往,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殖卑?” 一聲冷哼從身側響起站削,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孵稽,沒想到半個月后许起,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡菩鲜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年园细,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片接校。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡猛频,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛛勉,到底是詐尸還是另有隱情鹿寻,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布诽凌,位于F島的核電站毡熏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏侣诵。R本人自食惡果不足惜痢法,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一恬试、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疯暑,春花似錦训柴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至越锈,卻和暖如春仗嗦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甘凭。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工稀拐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丹弱。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓德撬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躲胳。 傳聞我的和親對象是個殘疾皇子蜓洪,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

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