防止页面被iframe恶意嵌套

新blog地址:http://hengyunabc.github.io/prevent-iframe-stealing/


缘起

在看资料时,看到这样的防止iframe嵌套的代码:

try {
    if (window.top != window.self) {
        var ref = document.referer;
        if (ref.substring(0, 2) === '//') {
            ref = 'http:' + ref;
        } else if (ref.split('://').length === 1) {
            ref = 'http://' + ref;
        }
        var url = ref.split('/');
        var _l = {auth: ''};
        var host = url[2].split('@');
        if (host.length === 1) {
            host = host[0].split(':');
        } else {
            _l.auth = host[0];
            host = host[1].split(':');
        }
        var parentHostName = host[0];
        if (parentHostName.indexOf("test.com") == -1 && parentHostName.indexOf("test2.com") == -1) {
            top.location.href = "http://www.test.com";
        }
    }
} catch (e) {
}

假定test.com,test2.com是自己的域名,当其它网站恶意嵌套本站的页面时,跳转回本站的首页。

上面的代码有两个问题:

  • referer拼写错误,实际上应该是referrer
  • 解析referrer的代码太复杂,还不一定正确

无论在任何语言里,都不建议手工写代码处理URL。因为url的复杂度超出一般人的想像。很多安全的问题就是因为解析URL不当引起的。比如防止CSRF时判断referrer。

URI的语法:

http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax

在javascript里解析url最好的办法

在javascript里解析url的最好办法是利用浏览器的js引擎,通过创建一个a标签:

var getLocation = function(href) {
    var l = document.createElement("a");
    l.href = href;
    return l;
};
var l = getLocation("http://example.com/path");
console.debug(l.hostname)

简洁防iframe恶意嵌套的方法

下面给出一个简洁的防止iframe恶意嵌套的判断方法:

if(window.top != window && document.referrer){
  var a = document.createElement("a");
  a.href = document.referrer;
  var host = a.hostname;

  var endsWith = function (str, suffix) {
      return str.indexOf(suffix, str.length - suffix.length) !== -1;
  }

  if(!endsWith(host, '.test.com') || !endsWith(host, '.test2.com')){
    top.location.href = "http://www.test.com";
  }
}

java里处理URL的方法

http://docs.oracle.com/javase/tutorial/networking/urls/urlInfo.html

用contain, indexOf, endWitch这些函数时都要小心。

 public static void main(String[] args) throws Exception {

        URL aURL = new URL("http://example.com:80/docs/books/tutorial"
                           + "/index.html?name=networking#DOWNLOADING");

        System.out.println("protocol = " + aURL.getProtocol());
        System.out.println("authority = " + aURL.getAuthority());
        System.out.println("host = " + aURL.getHost());
        System.out.println("port = " + aURL.getPort());
        System.out.println("path = " + aURL.getPath());
        System.out.println("query = " + aURL.getQuery());
        System.out.println("filename = " + aURL.getFile());
        System.out.println("ref = " + aURL.getRef());
    }

参考

http://stackoverflow.com/questions/736513/how-do-i-parse-a-url-into-hostname-and-path-in-javascript

http://stackoverflow.com/questions/5522097/prevent-iframe-stealing

时间: 2024-11-10 08:01:45

防止页面被iframe恶意嵌套的相关文章

iframe 嵌套 子页面-请我在网页内嵌入子页面除了iframe外还有其他什么方法么?

问题描述 请我在网页内嵌入子页面除了iframe外还有其他什么方法么? 想知道除了iframe能嵌套子页面外,还有什么其他办法可以实现~作为一个新手希望各位技术牛人不吝赐教! 解决方案 --利用jQuery嵌套 01 先抓取 xunlei.com 的这个页面的 HTML 代码 02 把获取到的 HTML 代码用 jQuery 对象化,再 find 方法查找需要的[嵌套区域]那段代码 03 将[嵌套区域]那代码用 jQuery 对象, 赋值需要网页里

jsp页面框架-iframe加载不了页面高度

问题描述 iframe加载不了页面高度 在iframe中嵌套一个页面a.jsp.a.jsp中有一个div .然div的值是通过ajax得到的.div里面是一个table.iframe显示出来的页面不完全,iframe的整个高度没有算上这个div的高度.怎么样把div的高度给加载到a.jsp页面,最后传给iframe?

jsp 页面全屏右键-如何实现页面含有iframe的右键菜单功能

问题描述 如何实现页面含有iframe的右键菜单功能 jsp主页面中嵌套多个iframe想要在主jsp页面实现右键菜单功能,并且iframe嵌套的页面也可以执行右键菜单功能,如何实现?为什么在主页面上写了右键菜单但是在嵌套的iframe上却不能用,向大神请教

js实现网页防止被iframe框架嵌套及几种location.href的区别_实用技巧

首先我们了解一下:window.location.href.location.href.self.location.href.parent.location.href.top.location.href他们的区别与联系,简单的说:几种location.href的区别 js实现网页被iframe框架功能 "window.location.href"."location.href"."self.location.href"是本页面跳转 "p

通过伪协议解决父页面与iframe页面通信的问题

 我们经常会有父页面与iframe页面的操作,比如 <iframe id = "iframe"></iframe> 这个iframe里面的内容是js写的.如以下代码   1 2 3 4 5 var iframe = document.getElementById("iframe"), doc = iframe.contentWindow.document; doc.open(); doc.write("---------someth

如何根据iframe内嵌页面调整iframe高宽续篇

接着昨天的工作 如何根据iframe内嵌页面调整iframe高宽 来说,按照文章中说的第二种方法实现代码如下: 实现 A.com/detail/view 页面的iframe代码如下: 1 <iframe id="thirdiframe" src="http://B.com/location/testiframe" width="100%" scrolling="no" frameborder="0" 

asp.net 文件上传与刷新与asp.net页面与iframe之间的数据传输_实用技巧

具体我们如何实现文件的异步刷新,目前网上已经有了很多文章来解决这个问题,但是会用到大量的javascript,由于本人编码功力尚浅,所以之今没有高清其中的所以然,但是在解决的方案中他们貌似都用到了iframe,这让我茅塞顿开,所以我就说说用这个处理刷新的思路. 首先一个实际的页面中往往是会有较多的内容,我们暂时把它分为A,B两个区域,A区域是内容区域,我们可以用updatepanel来实现异步刷新,B区域是上传区域,我们用div已经ifame占位,其中上传的具体功能实现我们可以放到C页面中,这样

在当前页面获得Iframe指向页面内对象

问题描述 当前页面<iframeid="countryFrame"src="country.jsp"height="300"width="200"frameborder="0"></iframe> Iframe指向的页面country.jsp<ul><li><inputtype="checkbox"name="checkbo

iframe里嵌套html,selenium xpath要如何写才能获取text为123的元素a

问题描述 iframe里嵌套html,selenium xpath要如何写才能获取text为123的元素a 123 222 解决方案 获取iframe中的document元素(无论是html还是xml都适用) 解决方案二: $("#iframeID").find("#a").val()