防止页面被iframe恶意嵌套

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 新blog地址:http://hengyunabc.github.io/prevent-iframe-stealing/缘起在看资料时,看到这样的防止iframe嵌套的代码:try { if (window.

新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

相关文章
|
7月前
|
存储 JavaScript 前端开发
前端xss攻击——规避innerHtml过滤标签节点及属性
前端xss攻击——规避innerHtml过滤标签节点及属性
394 4
|
应用服务中间件 nginx
iframe嵌套其他网站提示连接被拒绝
iframe嵌套其他网站提示连接被拒绝
1139 0
|
6月前
|
JavaScript 前端开发 API
快速实现 iframe 嵌套页面
【6月更文挑战第22天】快速实现 iframe 嵌套页面
|
5月前
|
前端开发 JavaScript 应用服务中间件
iframe动态操作标签分享
iframe动态操作标签分享
41 0
|
Web App开发 移动开发 安全
如何阻止 iframe 里引用的网页自动跳转
如何阻止 iframe 里引用的网页自动跳转
172 0
|
JavaScript 前端开发
js内联外联样式的获取,父页面获取iframe框架元素返回null
js内联外联样式的获取,父页面获取iframe框架元素返回null
|
JavaScript 搜索推荐 应用服务中间件
怎么防止网站被别人使用iframe框架恶意调用
发生歹意网站的危害关于新站来说,是比较大的。那我们应该怎样防止别人歹意镜像我们的网站呢?首要得了解一下镜像网站的原理,镜像网站大约需求以下的几个条件:你的网站运用了独立IP.当然,独立ip对一个网站来说,是好的,可以和其他网站差异开来,成为镜像网站的条件之一,只是独立ip的一个小缺陷。
143 0
怎么防止网站被别人使用iframe框架恶意调用
|
移动开发 安全 前端开发
谨慎能捕千秋蝉(三)——界面操作劫持与HTML5安全
ClickJacking点击劫持,这是一种视觉上的欺骗。 攻击者使用一个透明的、不可见的iframe,覆盖在网页的某个位置上,诱使用户点击iframe。
谨慎能捕千秋蝉(三)——界面操作劫持与HTML5安全
关于iframe页面里的重定向问题
    最近公司做的一个功能,使用了iframe,父页面内嵌子页面,里面的坑还挺多的,上次其实就遇到过,只不过今天在此描述一下。     请允许我画个草图:          外层大圈是父级页面,里层是子级页面,我们是在父级引用子级页面的,由于是两个页面,URL肯定不一样的,“一般的,在子页面做的操作也仅仅对子页面生效”,现在我要说的就是关于这一点的!     公司这个功能,在子级页面完成某个操作以后,需要跳转页面,于是子级页面的代码是这样写的:提交=>提交成功=>跳转B页面。
4795 0