Frame Buster Buster ... buster code needed

Let's say you don't want other sites to "frame" your site in an <iframe> :

<iframe src="http://example.org"></iframe>

So you insert anti-framing, frame busting JavaScript into all your pages:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

Excellent! Now you "bust" or break out of any containing iframe automatically. Except for one small problem.

As it turns out, your frame-busting code can be busted , as shown here:

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://example.org/page-which-responds-with-204'  
      }  
    }, 1)  
</script>

This code does the following:

  • increments a counter every time the browser attempts to navigate away from the current page, via the window.onbeforeunload event handler
  • sets up a timer that fires every millisecond via setInterval() , and if it sees the counter incremented, changes the current location to a server of the attacker's control
  • that server serves up a page with HTTP status code 204 , which does not cause the browser to navigate anywhere
  • My question is -- and this is more of a JavaScript puzzle than an actual problem -- how can you defeat the frame-busting buster?

    I had a few thoughts, but nothing worked in my testing:

  • attempting to clear the onbeforeunload event via onbeforeunload = null had no effect
  • adding an alert() stopped the process let the user know it was happening, but did not interfere with the code in any way; clicking OK lets the busting continue as normal
  • I can't think of any way to clear the setInterval() timer
  • I'm not much of a JavaScript programmer, so here's my challenge to you: hey buster, can you bust the frame-busting buster?


    I'm not sure if this is viable or not - but if you can't break the frame, why not just display a warning. For example, If your page isn't the "top page" create a setInterval method that tries to break the frame. If after 3 or 4 tries your page still isn't the top page - create a div element that covers the whole page (modal box) with a message and a link like...

    You are viewing this page in a unauthorized frame window - (Blah blah... potential security issue)

    click this link to fix this problem

    Not the best, but I don't see any way they could script their way out of that.


    FWIW, most current browsers support the X-Frame-Options: deny directive, which works even when script is disabled.

    IE8:
    http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx

    Firefox (3.6.9)
    https://bugzilla.mozilla.org/show_bug.cgi?id=475530
    https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header

    Chrome/Webkit
    http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
    http://trac.webkit.org/changeset/42333


    我们在http://seclab.stanford.edu/websec/framebusting/framebust.pdf的一个网站中使用了以下方法

    <style>
     body { 
     display : none   
    }
    </style>
    <script>
    if(self == top) {
    document.getElementsByTagName("body")[0].style.display = 'block';
    }
    else{
    top.location = self.location;
    }
    </script>
    
    链接地址: http://www.djcxy.com/p/10126.html

    上一篇: Python中增量和减量运算符的行为

    下一篇: 框架巴斯特巴斯特...需要巴斯特代码