《同源策略》的簡單介紹

[TOC]javascript

一、概述

同源策略是對JavaScript代碼可以操做哪些WEB內容的一條完整的安全限制,也是由Netscape提出的一個著名的安全策略。所謂同源簡單來講就是「三個相同」,
**
一、域名相同
二、協議相同
三、端口相同
**html

當咱們使用多個<iframe>元素或者打開其餘瀏覽器窗口的時候,這一策略就會發揮它的做用,在這種狀況下,同源策略負責管理窗口或者窗體中的JavaScript代碼以及和其餘窗口的交互,具體來講,腳本只能讀取所屬文檔的來源相同的窗口和文檔屬性(固然咱們也能夠經過JS實現多個窗口和窗體,在本章咱們不作解釋)固然同源策略也屬於一些理論性的知識點,存在於咱們平常的使用中,瞭解這些可以幫助咱們更好的理解前端的安全及知識。前端

文檔的來源包含協議、主機,以及載入文檔的URL端口。java

一、從不一樣的web服務器載入的文檔具備不一樣的來源。
二、經過同一主機的不一樣端口載入的文檔具備不一樣的來源。
三、使用http協議和https協議載入的文檔具備不一樣的來源。web

即便他們來自同一個服務器。
腳本自己的來源與同源策略並不相關,相關的是腳本所潛入的文檔的來源,同時同源策略還會應用於XMLHttpRequest生成的HTTP請求,這個對象容許客戶端javascript生成任意的HTTP請求到腳本所屬文檔的服務器,可是不容許腳本和其餘WEB服務器之間的通訊,這就是咱們常說的跨域請求,其實所謂的跨域就是受到了同源策略的約束,(固然咱們能夠經過其餘的方式來解決跨域之間的請求的問題)。跨域

二、同源策略的目的

同源政策的目的,是爲了保證用戶信息的安全,防止惡意的網站竊取數據。
設想這樣一種狀況:A網站是一家銀行,用戶登陸之後,又去瀏覽其餘網站。若是其餘網站能夠讀取A網站的 Cookie,會發生什麼?
很顯然,若是 Cookie 包含隱私(好比存款總額),這些信息就會泄漏。更可怕的是,Cookie 每每用來保存用戶的登陸狀態,若是用戶沒有退出登陸,其餘網站就能夠冒充用戶,隨心所欲。由於瀏覽器同時還規定,提交表單不受同源政策的限制。
因而可知,"同源政策"是必需的,不然 Cookie 能夠共享,互聯網就毫無安全可言了。

—— 摘自《瀏覽器同源政策及其規避方法》數組

三、文檔中設置同源:document.domain

在某些狀況下,同源策略就顯得比較嚴格了,好比在同一個域名下的其它子域名,例如兩個子域名:home.xiang.com和子域名order.xiang.com其中的一個子域名下須要合法的讀取另外一個子域名地下的文檔的屬性,爲了支持這種多域名站點,這時候咱們可使用document.dimin屬性來控制源,在默認狀況下document.domain的值是載入文檔的服務器的主機名,當咱們在設置這一屬性的時候,咱們使用的字符串必須具備有效的域前綴或它自己。瀏覽器

所以若是一個dimin初始值是home.xiang.com的字符串咱們能夠設置爲xiang.com另外document.domain的值中必須又一個點號,不能把它設置爲com或者其它頂級域名。安全

這時,若是兩個窗體或者窗口包含的腳本吧document.domain設置成了相同的值,那麼兩個窗口就再也不受同源策略的約束了。能夠相互讀取屬性了。服務器

四、請求中的 Access-Control-Allow-Origin

受到同源策略的影響,同時咱們也能夠經過一些方法來達到跨域資源的共享參見http://www.w3.org/TR/cors/ 這個標準和草案是用新的Origin:請求頭和新的Access-Control-Allow-Origin相應來擴展HTTP,它容許服務器用頭信息顯示的列出源,或使用通配符來匹配全部的源並容許由任何地址請求的文件,不少瀏覽器都使用這種新的頭信息來容許跨域的HTTP請求,這樣在咱們的XMLHttpRequest就不會被同源策略限制。

五、跨文檔消息傳遞 window.postMessage()

跨文檔消息,容許來自一個文檔的腳本能夠傳遞文本消息到另外一個文檔裏的腳本,而無論腳本的來源是否相同,當咱們調用window對象上的postMessage方法時就能夠異步的將信息傳遞到指定的窗口文檔,此時被接受的窗口中能夠經過onmessage()的方法來接收到傳遞過來的信息,可是不能調用其餘文檔的方法或者讀取屬性。也就是說這只是一種通訊技術,並不是是去控制另外一個文檔的內容。

postMessage()方法接受兩個參數,第一個參數是要傳遞的信息,HTML5標準中提到,該參數能夠是任意基本類型的只或者是能夠複製的對象,可是有些瀏覽器只支持字符串的傳遞,全部有時候傳遞的對象或者數組的時候須要進行轉換。第二個參數是一個字符串,是指定窗口的源,也就是指定窗口的document.domain屬性的值,這其中包括了協議、主機名、以及URL端口部分,(除了這些信息以外的信息都會被忽略),若是須要傳遞給任何窗口,此時這個只能夠設置爲*,若是要指定和當前窗口同源的話也可使用/便可。

在目標窗口就會觸發onmessage()事件,該事件接收到的是一個對象,包含一下屬性:

data

做爲第一個參數傳遞給 postMessage()方法的消息副本內容。

source

消息源自的window對象。

origin

一個字符串,指定消息來源(URL)。

——摘錄

本文大部份內容摘自《JavaScript權威指南》一書,詳細解說請參考書中內容。

做者的文章源地址 http://xiangzongliang.com/blo...