摘要:補(bǔ)充同源策略還應(yīng)該對(duì)一些特殊情況做處理,比如限制協(xié)議下腳本的訪(fǎng)問(wèn)權(quán)限。注意,該請(qǐng)求的查詢(xún)字符串有一個(gè)參數(shù),用來(lái)指定回調(diào)函數(shù)的名字,這對(duì)于是必需的。
1 前言:
首先對(duì)參考文章作者表示感謝,你們的經(jīng)驗(yàn)總結(jié)給我們這些新手提供了太多資源。
本文致力于解決AJAX的CORS問(wèn)題,我在邏輯上進(jìn)行了梳理:首先,系統(tǒng)的總結(jié)了CORS問(wèn)題的起源---同源策略;其次,介紹JSONP這種僅能支持GET請(qǐng)求的跨域方式和CORS作對(duì)比;最后,闡述CORS的XHR解決方式和IE中的XDR解決方式,在此基礎(chǔ)上提供了工具函數(shù)進(jìn)行跨瀏覽器的HTTP請(qǐng)求對(duì)象創(chuàng)建。
在客戶(hù)端編程語(yǔ)言中,如javascript和 ActionScript,同源策略是一個(gè)很重要的安全理念,它的目的是為了保證用戶(hù)信息的安全,防止惡意的網(wǎng)站竊取數(shù)據(jù)。
設(shè)想這樣一種情況:A網(wǎng)站是一家銀行,用戶(hù)登錄以后,又去瀏覽其他網(wǎng)站。如果其他網(wǎng)站可以讀取A網(wǎng)站的 Cookie,會(huì)發(fā)生什么?
很顯然,如果 Cookie 包含隱私(比如存款總額),這些信息就會(huì)泄漏。更可怕的是,Cookie 往往用來(lái)保存用戶(hù)的登錄狀態(tài),如果用戶(hù)沒(méi)有退出登錄,其他網(wǎng)站就可以冒充用戶(hù),為所欲為。因?yàn)闉g覽器同時(shí)還規(guī)定,提交表單不受同源政策的限制。由此可見(jiàn),"同源政策"是必需的,否則 Cookie 可以共享,互聯(lián)網(wǎng)就毫無(wú)安全可言了。
那么什么叫相同域(同源),什么叫不同的域(不同源)呢?當(dāng)兩個(gè)域具有相同的協(xié)議(如http), 相同的端口(如80),相同的host(如www.example.org),那么我們就可以認(rèn)為它們是相同的域。比如 http://www.example.org/index....(默認(rèn)端口號(hào)80可以省略)和http://www.example.org/sub/in...是同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何兩個(gè)都將構(gòu)成跨域。
注意:只有協(xié)議、域名、端口號(hào)完全一樣才是同一域,其他情況,即使是相對(duì)應(yīng)的IP和域名也是不同域,具體情況如下圖:
(這個(gè)圖片忘了從哪里引得了,感謝作者)
目前,如果非同源,共有三種行為受到限制。
(1) Cookie、LocalStorage 和 IndexDB 無(wú)法讀取。 (2) DOM 無(wú)法獲得。 (3) AJAX 請(qǐng)求不能發(fā)送。
作為前端開(kāi)發(fā)者,我們很多時(shí)候要做的是突破這種限制。
補(bǔ)充:同源策略還應(yīng)該對(duì)一些特殊情況做處理,比如限制file協(xié)議下腳本的訪(fǎng)問(wèn)權(quán)限。本地的HTML文件在瀏覽器中是通過(guò)file協(xié)議打開(kāi)的,如果腳本能通過(guò)file協(xié)議訪(fǎng)問(wèn)到硬盤(pán)上其它任意文件,就會(huì)出現(xiàn)安全隱患,目前IE8還有這樣的隱患。
3 跨域方式JSONP[參考1]JSONP是JSON with Padding的簡(jiǎn)寫(xiě),是應(yīng)用JSON實(shí)現(xiàn)服務(wù)器與客戶(hù)端跨源通信的常用方法。最大特點(diǎn)就是簡(jiǎn)單適用,老式瀏覽器全部支持,服務(wù)器改造非常小。
它的基本思想是,網(wǎng)頁(yè)通過(guò)添加一個(gè)