本文實例講述了JavaScript同源策略和跨域訪問。分享給大家供大家參考,具體如下:
1. 什么是同源策略
理解跨域首先必須要了解同源策略。同源策略是瀏覽器上為安全性考慮實施的非常重要的安全策略。
何謂同源:
URL由協議、域名、端口和路徑組成,如果兩個URL的協議、域名和端口相同,則表示他們同源。
同源策略:
瀏覽器的同源策略,限制了來自不同源的"document"或腳本,對當前"document"讀取或設置某些屬性。 (白帽子講web安全[1])
從一個域上加載的腳本不允許訪問另外一個域的文檔屬性。
舉個例子:
比如一個惡意網站的頁面通過iframe嵌入了銀行的登錄頁面(二者不同源),如果沒有同源限制,惡意網頁上的javascript腳本就可以在用戶登錄銀行的時候獲取用戶名和密碼。
在瀏覽器中,<script>、<img>、<iframe>、<link>等標簽都可以加載跨域資源,而不受同源限制,但瀏覽器限制了JavaScript的權限使其不能讀、寫加載的內容。
另外同源策略只對網頁的HTML文檔做了限制,對加載的其他靜態資源如javascript、css、圖片等仍然認為屬于同源。
代碼示例(http://localhost:8080/和http://localhost:8081由于端口不同而不同源):
http://localhost:8080/test.html
<html> <head><title>test same origin policy</title></head> <body> <iframe id="test" src="http://localhost:8081/test2.html"></iframe> <script type="text/javascript"> document.getElementById("test").contentDocument.body.innerHTML = "write somthing"; </script> </body></html>http://localhost:8081/test2.html
<html> <head><title>test same origin policy</title></head> <body> Testing. </body></html>
在Firefox中會得到如下錯誤:
Error: Permission denied to access property 'body'
Document對象的domain屬性存放著裝載文檔的服務器的主機名,可以設置它。
例如來自"blog.Vevb.com"和來自"bbs.Vevb.com"的頁面,都將document.domain設置為"Vevb.com",則來自兩個子域名的腳本即可相互訪問。
出于安全的考慮,不能設置為其他主domain,比如//m.survivalescaperooms.com/不能設置為sina.com
2. Ajax跨域
Ajax (XMLHttpRequest)請求受到同源策略的限制。
Ajax通過XMLHttpRequest能夠與遠程的服務器進行信息交互,另外XMLHttpRequest是一個純粹的Javascript對象,這樣的交互過程,是在后臺進行的,用戶不易察覺。
因此,XMLHTTP實際上已經突破了原有的Javascript的安全限制。
舉個例子:
假設某網站引用了其它站點的javascript,這個站點被compromise并在javascript中加入獲取用戶輸入并通過ajax提交給其他站點,這樣就可以源源不斷收集信息。
新聞熱點
疑難解答
圖片精選