javascript的同源策略

同源策略限制了一個源(origin)中加載文本或腳本與來自其它源(origin)中資源的交互方式。
同源定義
一.什麼是同源策略
   同源策略,它是由Netscape提出的一個著名的安全策略,現在所有的可支持javascript的瀏覽器都會使用這個策略。
  爲什麼需要同源策略,這裏舉個例子:
  假設現在沒有同源策略,會發生什麼事情呢?大家知道,JavaScript可以做很多東西,比如:讀取/修改網頁中某個值。恩,你現在打開了瀏覽器,在一 個tab窗口中打開了銀行網站,在另外一個tab窗口中打開了一個惡意網站,而那個惡意網站掛了一個的專門修改銀行信息的JavaScript,當你訪問 這個惡意網站並且執行它JavaScript時,你的銀行頁面就會被這個JavaScript修改,後果會非常嚴重!而同源策略就爲了防止這種事情發 生.  
   比如說,瀏覽器的兩個tab頁中分別打開了http://www.baidu.com/index.html和http: //www.google.com/index.html,其中,JavaScript1和JavaScript3是屬於百度的腳本,而 JavaScript2是屬於谷歌的腳本,當瀏覽器的tab1要運行一個腳本時,便會進行同源檢查,只有和www.baidu.com同源的腳本才能被執 行,所謂同源,就是指域名、協議、端口相同。所以,tab1只能執行JavaScript1和JavaScript3腳本,而JavaScript2不能 執行,從而防止其他網頁對本網頁的非法篡改。
如果兩個頁面擁有相同的協議(protocol),端口(如果指定),和主機,那麼這兩個頁面就屬於同一個源(origin)。
下表給出了相對http://store.company.com/dir/page.html同源檢測的示例:
URL 結果 原因
http://store.company.com/dir2/other.html 成功
http://store.company.com/dir/inner/another.html 成功
https://store.company.com/secure.html 失敗 協議不同
http://store.company.com:81/dir/etc.html 失敗 端口不同
http://news.company.com/dir/other.html 失敗 主機名不同
參見origin definition for file: URLs.
源繼承
來自about:blank,javascript:和data:URLs中的內容,繼承了將其載入的文檔所指定的源,因爲它們的URL本身未指定任何關於自身源的信息。
IE特例
在處理同源策略的問題上,IE存在兩個主要的不同之處。
授信範圍(Trust Zones):兩個相互之間高度互信的域名,如公司域名(corporate domains),不遵守同源策略的限制。
端口:IE未將端口號加入到同源策略的組成部分之中,因此 http://company.com:81/index.htmlhttp://company.com/index.html 屬於同源並且不受任何限制。
這些例外是非標準的,其它瀏覽器也未做出支持,但會助於開發基於window RT IE的應用程序。
變更源
頁面可以改變本身的源,但會受到一些限制。腳本可以設置document.domain 的值爲當前域的一個後綴
在同源策略中有一個例外,腳本可以設置 document.domain 的值爲當前域的一個後綴,如果這樣做的話,短的域將作爲後續同源檢測的依據。例如,假設在 http://store.company.com/dir/other.html 中的一個腳本執行了下列語句:
document.domain = “company.com”;
這條語句執行之後,頁面將會成功地通過對 http://company.com/dir/page.html 的同源檢測。而同理,company.com 不能設置 document.domain 爲 othercompany.com.
瀏覽器單獨保存端口號。任何的賦值操作,包括document.domain = documen.domain都會以null值覆蓋掉原來的端口號。因此company.com:8080頁面的腳本不能僅通過設置document.domain = “company.com”就能與company.com通信。賦值時必須帶上端口號,以確保端口號不會爲null。
附註:使用document.domain來安全是讓子域訪問其父域,需要同時將子域和父域的document.domain設置爲相同的值。必須要這麼做,即使是簡單的將父域設置爲其原來的值。沒有這麼做的話可能導致授權錯誤。
跨域網絡訪問
同源策略控制了不同源之間的交互,例如在使用XMLHttpRequest 或 標籤時則會受到同源策略的約束。交互通常分爲三類:
通常允許進行跨域寫操作(Cross-origin writes)。例如鏈接(links),重定向以及表單提交。特定少數的HTTP請求需要添加 preflight。
通常允許跨域資源嵌入(Cross-origin embedding)。之後下面會舉例說明。
通常不允許跨域讀操作(Cross-origin reads)。但常可以通過內嵌資源來巧妙的進行讀取訪問。例如可以讀取嵌入圖片的高度和寬度,調用內嵌腳本的方法,或availability of an embedded resource.
以下是一些可以跨域內嵌的資源示例:
標籤嵌入跨域腳本。語法錯誤信息只能在同源腳本中捕捉到。
標籤嵌入CSS。由於CSS的鬆散的語法規則,CSS的跨域需要一個設置正確的Content-Type消息頭。不同瀏覽器有不同的限制: IE, Firefox, Chrome, Safari (跳至CVE-2010-0051)部分 和 Opera。
嵌入圖片。支持的圖片格式包括PNG,JPEG,GIF,BMP,SVG,…
嵌入多媒體資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章