摘要:跨域原因同源策略在客戶端編程語言中,如和,同源策略是一個很重要的安全理念,它在保證數據的安全性方面有著重要的意義。同源策略規定跨域之間的腳本是隔離的,一個域的腳本不能訪問和操作另外一個域的絕大部分屬性和方法。由兩部分組成回調函數和數據。
1.JavaScript跨域原因--同源策略
在客戶端編程語言中,如javascript和 ActionScript,同源策略是一個很重要的安全理念,它在保證數據的安全性方面有著重要的意義。同源策略規定跨域之間的腳本是隔離的,一個域的腳本不能訪問和操作另外一個域的絕大部分屬性和方法。那么什么叫相同域,什么叫不同的域呢?當兩個域具有相同的協議(如http), 相同的端口(如80),相同的host(如www.example.org),那么我們就可以認為它們是相同的域。比如 http://www.example.org/index....和http://www.example.org/sub/in...是同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何兩個都將構成跨域。同源策略還應該對一些特殊情況做處理,比如限制file協議下腳本的訪問權限。本地的HTML文件在瀏覽器中是通過file協議打開的,如果腳本能通過file協議訪問到硬盤上其它任意文件,就會出現安全隱患,目前IE8還有這樣的隱患。
由于JavaScript同源策略的限制,跨域資源共享就會受到制約:a.com域名下的js無法訪問b.com或c.a.com下的對象,雖然保證了安全,但是給注入iframe和AJAX應用帶來麻煩。跨域的限制具體表現為:
注意:只有協議、域名、端口號完全一樣才是同一域,其他情況,即使是相對應的IP和域名也是不同域。
解決跨域問題的方式 單向跨域 JSONP、window.name、server proxy 雙向跨域 document.domain、window.postMessage 后端方法:https://developer.yahoo.com/j...
server proxy在數據提供方沒有提供對JSONP協議或者 window.name協議的支持,也沒有對其它域開放訪問權限時,我們可以通過server proxy的方式來抓取數據。例如當www.a.com域下的頁面需要請求www.b.com下的資源文件asset.txt時,直接發送一個指向 www.b.com/asset.txt的Ajax請求肯定是會被瀏覽器阻止。這時,我們在www.a.com下配一個代理,然后把Ajax請求綁定到這個代理路徑下,例如www.a.com/proxy/, 然后這個代理發送HTTP請求訪問www.b.com下的asset.txt,跨域的HTTP請求是在服務器端進行的,客戶端并沒有產生跨域的Ajax請求。這個跨域方式不需要和目標資源簽訂協議,帶有侵略性,另外需要注意的是實踐中應該對這個代理實施一定程度的保護,比如限制他人使用或者使用頻率。
前端方法: 方法1 document.domain+iframe適用于:主域相同而子域不同(二級域名相同、協議相同、端口相同)。
具體的做法是可以在http://www.a.com/a.html和http://script.a.com/b.html兩個文件中分別加上document.domain = ‘a.com’;然后通過a.html文件中創建一個iframe,去控制iframe的contentDocument,這樣兩個js文件之間就可以“交互”了。
//www.a.com上的a.html document.domain = "a.com"; var ifr = document.createElement("iframe");//創建子框架 ifr.src = "http://script.a.com/b.html"; //子框架指向b.html ifr.style.display = "none"; document.body.appendChild(ifr); ifr.onload = function(){ //定義指針指向子框架內容的文檔對象, 跨瀏覽器兼容 var doc = ifr.contentDocument || ifr.contentWindow.document; // 獲得子框架的文檔對象之后在這里操縱b.html alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue); };
注意:除IE外的四大瀏覽器支持contentDocument屬性,IE8以下只支持contentWindow對象,這個對象具有document屬性,這個屬性的效果和contentDocument屬性一致。
//script.a.com上的b.html document.domain = "a.com";
問題:
1、安全性,當一個站點(b.a.com)被攻擊后,另一個站點(c.a.com)會引起安全漏洞。 2、如果一個頁面中引入多個iframe,要想能夠操作所有iframe,必須都得設置相同domain。方法2: 跨文檔消息傳遞 cross-document messaging,XDM(HTML5新增)
適用:這個方法非常強大,無視協議,端口,域名的不同。
otherWindow.postMessage(message, targetOrigin);
參數: otherWindow: 對接收信息頁面的window的引用。可以是:頁面中iframe的 contentWindow屬性;window.open的返回值;通過name或下標從window.frames取到的值。
message: 所要發送的數據,string類型。 targetOrigin: 用于限制otherWindow,“*”表示不作限制
a.com/index.html中的代碼:
b.com/index.html中的代碼:
方法3 JSONP(JSON with padding)
原理:使用