谈谈浏览器 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来减少垃圾评论。了解我们如何处理您的评论数据。