如何防止自己的页面被别人利用iframe盗用(该页面本身需要被自己页面iframe嵌套)

4,207 阅读2分钟

前些天遇到一个问题,

本来使用iframe嵌套在自己网页里的几个小图表(以下称“被套页”),被不良商家窃走,套在了他们的网页中。

由于被套页并没有做反盗用措施,且页面里的数据很重要,所以需要尝试一下反盗用。

目前上能查到的防止盗用的方法,很多的适应场景为页面本身不用于嵌套而做的,对于上述问题不太适用,因此还需另寻他法。

以下是解决思路:

首先想到的是,盗用者使用iframe嵌套,那么我的页面加载后可通过window.top查看外层页面的地址,从而判断是否是我自己的框架使用。
查看window.top.location,发现确实如此,盗用者的页面可以查看到地址的不同,那么

if(window.top.location.hostname.search('10jqka.com.cn')===-1){//只允许自己的地址嵌套    
  // window.top.location.href='//stockpage.10jqka.com.cn/'+(getCode()||'')
}
使用本地代理js文件进行测试,!失败!

DOMException: "Permission denied to access property "hostname" on cross-origin object"
浏览器提示代码出错!!
原因是因为它们跨域(cross-domain)了,浏览器的安全政策不允许被嵌套者的网页操作嵌套者的网页,反之亦然。
IE把这种错误叫做"没有权限"。进一步说,浏览器甚至不允许你查看top.location.hostname,跨域情况下,一看到这个对象,就直接报错。

那么该如何修改呢?

对于上面的报错,我们可以利用起来。
我们只要查看top.location.hostname是否报错就可以了。如果报错了,表明存在跨域,就对top对象进行URL重导向;如果不报错,表明不存在跨域(或者未使用框架),就不采取操作。
剧情似乎渐渐明朗了起来。

try{  top.location.hostname;}catch(e){  top.location.href = window.location.href;}
这样做应当可以正确重定向,
但是,部分浏览器默认禁止重定向,甚至不会弹出确认按钮
因此可以换成另一种解决办法 

try{  
  top.location.hostname;
}catch(e){  
  document.getElementsByTagName('body')[0].innerHTML='股票实时行情,欢迎点击进入同花顺查询:<a target="_blank" href="'+'http://stockpage.10jqka.com.cn/'+'">'+'http://stockpage.10jqka.com.cn/'+'</a>'
}
放到嵌套者网页看,ok
放到自己网页看,

居然也走进了catch??

原因是:自己网页的domain和iframe的domain不相同。需要让两个页面的domain保持完全相同('music.baidu.com'和'www.baidu.com'和'baidu.com'都是不相同的)

首先要将两者保持一致,然后再执行上述方案。

document.domain='10jqka.com.cn'; 

 搞定!