談談瀏覽器 iframe 跨域 的沙盒模式

眾所周知,現代的瀏覽器通過iframe調用不同域下的頁面,會觸發沙盒模式,比如: a.com/a.html iframe內框 b.com/b.html,b.com/b.html 的內頁無法通過js操作 a.com/a.html。這樣做可以 防止跨域攻擊,使網絡訪問更安全。如果更復雜的模式,比如 a.com/a.html iframe內框 b.com/b.html,b.com/b.html iframe內框 a.com/c.html,這時 a.com/c.html 可以訪問 a.com/a.html嗎?估計這個大部分人就都不知道了,做一個簡單的實驗:
1、http://www.dezaoju.com/sanbox/ 內嵌 http://www.shuodahua.com/sanbox/
2、http://www.shuodahua.com/sanbox/ 內嵌 http://www.dezaoju.com/sanbox/frame.html
經過測試,無論內嵌多少層,只要是同域的 頁面,測試 IE、Chrome、Firefox 都不會觸發 sanbox

具體的測試代碼(http://www.dezaoju.com/sanbox/index.html):


<html>
<head>
<script>
var data = {
	name: '可以正常讀取'
};
window.onload = function(){
	document.getElementById("test").value = window.top.data.name;
};
</script>
</head>
<body>
<h1>www.dezaoju.com/sanbox/</h1>
<input id="test"><br><br>
<iframe src="http://www.shuodahua.com/sanbox/" width="80%" height="600"></iframe>
<br>
</body>
</html>

http://www.dezaoju.com/sanbox/index.html:


<html>
<head>
<script>
window.onload = function(){
	document.getElementById("test").value = window.top.data.name;
};
</script>
</head>
<body>
<h1>www.shuodahua.com/sanbox/</h1>
<input id="test"><br><br>
<iframe src="http://www.dezaoju.com/sanbox/frame.html" width="80%" height="400"></iframe>
</body>
</html>

http://www.dezaoju.com/sanbox/frame.html:

<html>
<head>
<script>
window.onload = function(){
	document.getElementById("test").value = window.parent.parent.data.name;
};
</script>
</head>
<body>
<h1>www.dezaoju.com/sanbox/frame.html</h1>
<input id="test">
</body>
</html>

可能 您看到這里,會說 了解這些有毛用啊,能賺錢嗎?

是的,能賺錢!

一般個人的網站,靠廣告聯盟變現是一個非常重要的途徑。一般廣告聯盟都會非常人性化,對沒有匹配到廣告的廣告位,支持顯示用戶自己的廣告。 以大名鼎鼎的Google Adsense為例,在廣告設置中可以設置“如果沒有可投放的廣告,展示其他網址”,這樣我們既可以 在沒有廣告時,顯示另一個廣告聯盟的廣告(比如:百度)。

這樣流量不浪費了,卻很容易被廣告判斷為作弊(每次訪問的頁面都是一樣的,只有廣告代碼)。解決也很簡單,直接在 如果沒有可投放的廣告,展示其他網址 頁面中動態加載廣告代碼就可以了,這是來路域名為真實的來路,不僅能賺錢,還能避免當做作弊被封號。

上面的例子中,http://www.dezaoju.com/sanbox/ 為 我們的網頁;http://www.dezaoju.com/sanbox/ 為谷歌聯盟;www.dezaoju.com/sanbox/frame.html 為 匹配不到廣告是,展示的頁面。最終的效果如下:

對 www.dezaoju.com/sanbox/frame.html的修改:

<script>

<html>
<head>
<script>
window.onload = function(){
	document.getElementById("test").value = window.parent.parent.data.name;
	
	var doc = window.top.document;
	var ad = doc.createElement('div');
	ad.innerHTML = '<iframe src="http://www.dezaoju.com/sanbox/ad.html"></iframe>';
	doc.body.appendChild(ad);
};
</script>
</head>
<body>
<h1>www.dezaoju.com/sanbox/frame.html</h1>
<input id="test">
</body>
</html>

廣告頁的代碼很簡單(www.dezaoju.com/sanbox/ad.html),只是為了判斷 來路地址:


來路域名:<script>document.write(document.referrer);</script>

發表評論

電子郵件地址不會被公開。 必填項已用*標注

此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據。