一、問答題
1. 什么是同源策略
(1)含義:1995年荡短,同源政策由 Netscape 公司引入瀏覽器丐枉。目前,所有瀏覽器都實行這個政策肢预。
最初矛洞,它的含義是指,A網(wǎng)頁設(shè)置的 Cookie烫映,B網(wǎng)頁不能打開沼本,除非這兩個網(wǎng)頁“同源”。所謂“同源”指的是”三個相同“锭沟。
1.協(xié)議相同
2.域名相同
3.端口相同
(2)目的:同源政策的目的抽兆,是為了保證用戶信息的安全,防止惡意的網(wǎng)站竊取數(shù)據(jù)族淮。
(3)限制范圍:隨著互聯(lián)網(wǎng)的發(fā)展辫红,“同源政策”越來越嚴(yán)格。目前祝辣,如果非同源贴妻,共有三種行為受到限制。
1.Cookie蝙斜、LocalStorage 和 IndexedDB 無法讀取名惩。
2.DOM 無法獲得。
3.AJAX 請求不能發(fā)送孕荠。
2. 什么是跨域娩鹉?跨域有幾種實現(xiàn)形式
(1)神馬是跨域(Cross Domain)?
說白點就是post、get的url不是你當(dāng)前的網(wǎng)站稚伍,域名不同弯予。例如在aaa.com/a.html里面,表單的提交action是bbb.com/b.html个曙。
不僅如此锈嫩,www.aaa.com和aaa.com之間也屬于跨域,因為www.aaa.com是二級域名,aaa.com是根域名呼寸。
JavaScript出于安全方面的考慮那槽,是不允許跨域調(diào)用其他頁面的對象的(同源策略 Same-Origin Policy)。
關(guān)于JavaScript能否跨域通信的詳細說明等舔,見下表:
http://www.a.com/a.js訪問以下URL的結(jié)果
URL | 說明 | 是否允許通信 |
---|---|---|
http://www.a.com/b.js | 同一域名下 | 允許 |
http://www.a.com/script/b.js | 同一域名下不同文件 | 允許 |
http://www.a.com:8000/b.js | 同一域名,不同端口 | 不允許 |
https://www.a.com/b.js | 同一域名糟趾,不同協(xié)議 | 不允許 |
http://70.32.92.74/b.js | 域名和域名對應(yīng)IP | 不允許 |
http://script.a.com/b.js | 主域相同子域不同 | 不允許 |
http://a.com/b.js | 同一域名慌植,不同二級域名 | 不允許 |
http://www.b.com/b.js | 不同域名 | 不允許 |
(2)跨域的實現(xiàn)形式
JSONP:JSONP (JSON with Padding)是一個簡單高效的跨域方式,html中的script標(biāo)簽可以加載并執(zhí)行其他域的JavaScript义郑,于是我們可以通過script標(biāo)記來動態(tài)加載其他域的資源蝶柿。例如我要從域A的頁面pageA加載域B的數(shù)據(jù),那么在域B的頁面pageB中我以JavaScript的形式聲明pageA需要的數(shù)據(jù)非驮,然后在pageA中用script標(biāo)簽把pageB加載進來交汤,那么pageB中的腳本就會得以執(zhí)行。JSONP在此基礎(chǔ)上加入了回調(diào)函數(shù)劫笙,pageB加載完之后會執(zhí)行pageA中定義的函數(shù)芙扎,所需要的數(shù)據(jù)會以參數(shù)的形式傳遞給該函數(shù)。JSONP易于實現(xiàn)填大,但是也會存在一些安全隱患戒洼,如果第三方的腳本隨意地執(zhí)行,那么它就可以篡改頁面內(nèi)容允华,截獲敏感數(shù)據(jù)圈浇。但是在受信任的雙方傳遞數(shù)據(jù),JSONP是非常合適的選擇靴寂。
window.name:window對象的name屬性是一個很特別的屬性磷蜀,當(dāng)該window的location變化,然后重新加載百炬,它的name屬性可以依然保持不變褐隆。那么我們可以在頁面A中用iframe加載其他域的頁面B,而頁面B中用JavaScript把需要傳遞的數(shù)據(jù)賦值給window.name收壕,iframe加載完成之后妓灌,頁面A修改iframe的地址,將其變成同域的一個地址蜜宪,然后就可以讀出window.name的值了虫埂。這個方式非常適合單向的數(shù)據(jù)請求,而且協(xié)議簡單圃验、安全掉伏。不會像JSONP那樣不做限制地執(zhí)行外部腳本。
document.domain:通過修改document的domain屬性,我們可以在域和子域或者不同的子域之間通信斧散。同域策略認(rèn)為域和子域隸屬于不同的域供常,比如www.a.com和sub.a.com是不同的域,這時鸡捐,我們無法在www.a.com下的頁面中調(diào)用sub.a.com中定義的JavaScript方法栈暇。但是當(dāng)我們把它們document的domain屬性都修改為a.com,瀏覽器就會認(rèn)為它們處于同一個域下箍镜,那么我們就可以互相調(diào)用對方的method來通信了源祈。
window.postMessage:window.postMessage是html5定義的一個很新的方法,這個方法可以很方便地跨window通信色迂。由于它是一個很新的方法香缺,所以在很舊和比較舊的瀏覽器中都無法使用。
CORS:CORS需要瀏覽器和服務(wù)器同時支持歇僧。目前图张,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10诈悍。
整個CORS通信過程祸轮,都是瀏覽器自動完成,不需要用戶參與侥钳。對于開發(fā)者來說倔撞,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣慕趴。瀏覽器一旦發(fā)現(xiàn)AJAX請求跨源痪蝇,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求冕房,但用戶不會有感覺躏啰。
因此,實現(xiàn)CORS通信的關(guān)鍵是服務(wù)器耙册。只要服務(wù)器實現(xiàn)了CORS接口给僵,就可以跨源通信。
3. jsonp 的原理是什么
原理:
1详拙、瀏覽器的同源策略把跨域請求都禁止了帝际;
2、HTML的<script>標(biāo)簽是例外饶辙,可以突破同源策略從其他來源獲取數(shù)據(jù)蹲诀;
3、由上可得弃揽,我們可以通過動態(tài)創(chuàng)建<script>標(biāo)簽引入jsonp文件脯爪,然后通過一系列JS操作獲取數(shù)據(jù)则北。-
JSONP所存在的問題:
- 使用遠程網(wǎng)站的script標(biāo)簽時,若遠程網(wǎng)站的script標(biāo)簽本身存在著漏洞痕慢,則引入的網(wǎng)站也會被影響尚揣,跨域的網(wǎng)站需要相互驗證,并設(shè)置token掖举。來保證安全性快骗。
- 基于script標(biāo)簽的資源能能get數(shù)據(jù),不能post數(shù)據(jù)塔次,也就是說滨巴,只能讀,不具有寫的功能俺叭。
- callback可能被注入一些惡意字符,可采用正則過濾的方式來消除這種錯誤泰偿。
4. CORS是什么
它的全稱叫做Cross-Origin Resource Sharing熄守,也就是跨域資源共享的意思,它是一種W3C規(guī)范耗跛,允許從瀏覽器的跨域通信裕照。通過建立XMLHttpRequest對象的header,CORS允許開發(fā)者使用相同的習(xí)慣作為跨域請求工作调塌。Chrome晋南、Firefox、Opera和Safari都是用XMLHttpRequest2中的對象羔砾,而IE則使用類似的XDomainRequest负间。
具體使用方法:在要被請求的文件中聲明header(“Access-Control-Allow-Origin: example.org”)即可
在IE10及以下,CORS都具有兼容性問題姜凄。
二政溃、實操題
1.降域
2.CORS
在http://www.a.wayne.com:8080/loadmore.html 中加載 'http://www.b.wayne.com:8080/loadMore.php'
在php文件加了header("Access-Control-Allow-Origin: http://www.a.wayne.com:8080");
3.JSONP
a.wayne.com:8080/demo2.html 中加載 b.wayne.com:8080/data.js
版權(quán)聲明:本教程版權(quán)歸饑人谷和作者(我)所有,轉(zhuǎn)載須說明來源态秧。