防止页面被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-10-10 06:34:05

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

父子页面(iframe)相互获取对方dom元素

现在iframe的使用虽然开始越来越少,但是还是有牵涉到iframe的使用情况,特别是多个iframe互相嵌套,又要进行获取的情况. 现在整理了父子iframe之间互相获取的方式. (1)父页面获取子页面的方式. 主要通过: iframe的contentWindow属性,代表iframe所在的window对象. 示例如下: <script type="text/javascript"> window.onload = function(){ var cWindow = do

iframe多层嵌套时获取元素

一.同域:1.父页面获取子页面元素:注意:onload事件jQuery获取:$("iframe").contents().find("holder")......; (嵌套三层,或者更多时)$('iframe').contents().find('iframe').contents().find("iframe")...... js获取:window.frames["holder"].contentWindow.documen

iframe多层嵌套时获取元素总结

同域: 父页面获取子页面元素: 注意:onload事件 jQuery获取:$("iframe").contents().find("holder")......; (嵌套三层,或者更多时)$('iframe').contents().find('iframe').contents().find("iframe")...... js获取:window.frames["holder"].document 或者 window.fra

JavaScript:父页面与Iframe页面方法互调

父页面调用Iframe页面中的函数 以上是父页面中定义的iframe,注意添加name属性 在父页面中调用mapFrame的ShowMyLocation方法 Iframe页面调用父页面的方法 直接在Iframe内的页面通过window.parent.FuncName();调用即可 其中FuncName为方法名称

父页面操作iframe子页面的安全漏洞及跨域限制问题

一.父子交互的跨域限制 同域情况下,父页面和子页面可以通过iframe.contentDocument或者parent.document来交互(彼此做DOM操作等,如父页面往子页面注入css). 跨域情况下,就会有限制,无法相互操作. [解决办法] 1.主域不同 没招 2.主域相同,子域不同 以父(a.baidu.com)子(b.baidu.com)为例: 这俩页面相互操作,要是想解决跨域限制,必须设置一个共同的主域,即document.domain="baidu.com" 二.禁止父

js父页面使用iframe中的函数

js父页面使用iframe中的函数:iframe是非常常用的一个html元素,如果在父页面中使用子页面的方法应该怎么写呢,下面就做一下简单的介绍.一.父页面代码: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> &l

主页面、iframe之间调用以及传值

主页面.iframe之间的调用和传值,无非就是两个交互形式: 主页面与子页面的交互 子页面之间的交互 接下来要讲的是四种交互传值的方式:利用postMessage方法传值.DOM操作传值.URL方式传值.利用全局属性传值 利用postMessage方法传值 这种方式非常像事件绑定.监听.postMessage方法接收两个参数:一条消息.一个表示消息接收方来自哪个域的字符串.第二个参数对保障安全通信非常重要,可以防止浏览器把消息发送到不安全的地方. 下面是应用实例: //主页面发送消息 var m

网站被挂暗链、点开同一链接进入不同页面(博彩页面)、恶意脚本(INCLUDE(pack(&#39;H*&#39;)……)之类

原文链接 论坛被挂暗链问题分析与解决http://blog.kankanan.com/posts/2014/04/01_8bba575b88ab6302669794fe95ee9898520667904e0e89e351b3.html 发现问题 有网友反映我们的论坛被挂了暗链,具体表现为从 google 搜索论坛名称结果如下图所示: 直接搜索论坛网址出现的一些热门帖子也被挂了暗链,通过 google 搜索结果访问会跳到恶意网站, 解决问题 直接通过网址访问论坛则没有任务问题,应该是论坛被注入了恶

在父页面和其iframe之间函数回调 父页面回调iframe里写的函数

// @shaoyang  父页面 window['mengBanLogin']={ mengBanArr : new Array(), mengBanLoginSuccess : function(){ console.log('mengbanzhixing'); if(mengBanLogin.mengBanArr.length > 0){ for(var i = mengBanLogin.mengBanArr.length-1; i >= 0; i--){ mengBanLogin.me