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 viaonbeforeunload = 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?
Advertisement
Answer
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.