概念:同源策略是客戶端腳本(尤爲是Javascript)的重要的安全度量標準。它最先出自Netscape Navigator2.0,其目的是防止某個文檔或腳本從多個不一樣源裝載。
這裏的同源指的是:同協議,同域名和同端口。
精髓:
它的精髓很簡單:它認爲自任何站點裝載的信賴內容是不安全的。當被瀏覽器半信半疑的腳本運行在沙箱時,它們應該只被容許訪問來自同一站點的資源,而不是那些來自其它站點可能懷有惡意的資源。
爲何要有同源限制?
咱們舉例說明:好比一個黑客程序,他利用IFrame把真正的銀行登陸頁面嵌到他的頁面上,當你使用真實的用戶名,密碼登陸時,他的頁面就能夠經過Javascript讀取到你的表單中input中的內容,這樣用戶名,密碼就輕鬆到手了。
Ajax應用:
在Ajax應用中這種安全限制被突破。
在普通的Javascript應用中,咱們能夠修改Frame的href,或者IFrame的src,以實現GET方式的跨域提交,可是卻不能訪問跨域的Frame/IFrame中的內容。
而Ajax它經過XMLHTTP進行異步交互,這個對象一樣可以與遠程的服務器進行信息交互,並且更加危險的是,XMLHTTP是一個純粹的Javascript對象,這樣的交互過程,是在後臺進行的,不被用戶察覺。所以,XMLHTTP實際上已經突破了原有的Javascript的安全限制。
若是咱們又想利用XMLHTTP的無刷新異步交互能力,又不肯意公然突破Javascript的安全策略,能夠選擇的方案就是給XMLHTTP加上嚴格的同源限制。這樣的安全策略,很相似於Applet的安全策略。IFrame的限制還僅僅是不能訪問跨域HTMLDOM中的數據,而XMLHTTP則根本上限制了跨域請求的提交。
瀏覽器支持:而IE其實給這個安全策略開了兩個想固然的後門,一個是:他假設你的本地文件,天然清楚將會訪問什麼內容,因此任何你的本地文件訪問外部數據, 都不會收到任何的警告。另外一個是:當你訪問的網站腳本打算訪問跨域的信息時, 他竟然僅僅是彈出一個對話框來提醒你一下。若是一個欺詐網站,採用這樣的手段,提供一個假頁面給你,而後經過XMLHTTP幫你遠程登陸真實的銀行服務器。只要10個用戶裏,有一個用戶糊塗一下,點了一個肯定。他們的盜取賬號行爲,就成功了! 你想一想看,這是何等危險的事情!
FireFox就不是這樣的作法,缺省的狀況下,FireFox根本就不支持跨域的XMLHTTP請求,根本就不給黑客這樣的機會。
避免同源策略:
JSON和動態腳本標記
<script type="text/javascript"
src="http://travel.com/findItinerary?username=sachiko&
reservationNum=1234&output=json&callback=showItinerary" />
當 JavaScript 代碼動態地插入 <script> 標記時,瀏覽器會訪問 src 屬性中的 URL。這樣會致使將查詢字符串中的信息發送給服務器。在 清單 1中,所傳遞的是 username 和 reservation 做爲名稱值對傳遞。此外,查詢字符串還包含向服務器請求的輸出格式和回調函數的名稱(即 showItinerary)。<script> 標記加載後,會執行回調函數,並經過回調函數的參數把從服務返回的信息傳遞給該回調函數。
Ajax代理
Ajax 代理是一種應用級代理服務器,用於調解 Web 瀏覽器和服務器之間的 HTTP 請求和響應。Ajax 代理容許 Web 瀏覽器繞過同源策略,這樣即可以使用 XMLHttpRequest 訪問第三方服務器。要實現這種繞過,有以下兩種方法可供選擇:
客戶端 Web 應用程序知道第三方 URL 並將該 URL 做爲 HTTP 請求中的一個請求參數傳遞給 Ajax 代理。而後,代理將請求轉發給 [url]www.remoteservice.com[/url]。注意,能夠把代理服務器的使用隱藏在 Web應用程序開發人員所使用的 Ajax 庫的實現中。對於 Web 應用程序開發人員而言,它看上去可能徹底不具備同源策略。
客戶端 Web 應用程序不知道第三方 URL,而且嘗試經過 HTTP 訪問 Ajax 代理服務器上的資源。經過一個預約義的編碼規則,Ajax 代理將 所請求的 URL 轉換爲第三方服務器的 URL 並表明客戶檢索內容。這樣一來,Web 應用程序開發人員看上去就像是在和代理服務器直接進行通訊。
Greasemonkey
Greasemonkey 是一個 Firefox 擴展,它容許用戶動態地對 Web 頁面的樣式和內容進行修改。Greasemonkey 用戶能夠把用戶腳本(user script)文件與一個 URL 集合創建關聯。當瀏覽器經過該 URL 集合加載頁面時,便會執行這些腳本。Greasemonkey 爲用戶腳本的 API 提供了額外的許可(與運行在瀏覽器沙盒中的腳本的許可相比較)。
GM_XMLHttpRequest 是其中的一個 API,它從本質上說就是一個不具備同源策略的 XMLHttpRequest。用戶腳本能夠將瀏覽的內置 XMLHttpRequest 替代爲 GM_XMLHttpRequest,從而許可 XMLHttpRequest 執行跨域訪問。
GM_XMLHttpRequest 的使用只能經過用戶贊成的途徑才能受到保護。也就是說,Greasemonkey 只有在創建新用戶腳本與特定 URL 的集合之間的關聯時纔會要求用戶配置。然而,不難想象一些用戶可能會被欺騙,在沒有徹底理解其後果時就接受該安裝。javascript