|
|
| Line 1: |
Line 1: |
| − | A framekiller (or framebuster or framebreaker) is a piece of JavaScript code that doesn't allow a Web page to be displayed within a frame. A frame is a subdivision of a Web browser window and can act like a smaller window. This kind of script is often used to prevent a frame from an external Web site being loaded from within a frameset without permission. | + | A framekiller (or framebuster or framebreaker) is a piece of JavaScript code that doesn't allow a Web page to be displayed within a frame. A frame is a suEJFKDSNFD |
| − | | |
| − | The typical source code for a framekiller script is:
| |
| − | | |
| − | <script type="text/javascript">
| |
| − | if(top != self) top.location.replace(location);
| |
| − | </script>
| |
| − | | |
| − | There are many variations of this script. This example is cross-browser compatible, avoids depreciated objects, and uses replace which preserves the user's back-button. Comparing object references, top, self and location directly is slightly more efficient, and succinct.
| |
| − | == Framekiller Killers ==
| |
| − | | |
| − | The above framekiller can be prevented from working with the following JavaScript along with a server which responds with a HTTP/1.1 204 No Content, as discovered in this blog
| |
| − |
| |
| − | . Just place the following code in the top frame. It works because in most browsers a 204 HTTP response will do nothing, meaning it will leave us on the current page. But the request attempt will override the previous frame busting attempt, rendering it useless.
| |
| − | | |
| − | var prevent_bust = 0;
| |
| − | | |
| − | // Event handler to catch execution of the busting script.
| |
| − | window.onbeforeunload = function() { prevent_bust++ };
| |
| − | | |
| − | // Continuously monitor whether busting script has fired.
| |
| − | setInterval(function() {
| |
| − | if (prevent_bust > 0) { // Yes: it has fired.
| |
| − | prevent_bust -= 2; // Avoid further action.
| |
| − | // Get a 'No Content' status which keeps us on the same page.
| |
| − | window.top.location = 'http://server-which-responds-with-204.com';
| |
| − | }
| |
| − | }, 1);
| |
| − | | |
| − | == Alternative Solution ==
| |
| − | | |
| − | An alternative choice is to allow the user to determine whether to let the framekiller work, as discovered by the Framekiller Killer
| |
| − |
| |
| − | .
| |
| − | | |
| − | var framekiller = true;
| |
| − | window.onbeforeunload = function() {
| |
| − | if(framekiller) {
| |
| − | return "..."; // any message that helps user to make decision
| |
| − | }
| |
| − | };
| |
| − | | |
| − | and the code below should be added after the frame tag:
| |
| − | | |
| − | //"my_frame" should be changed according to the real id of the frame in your page
| |
| − | document.getElementById("my_frame").onload = function() {
| |
| − | framekiller = false;
| |
| − | };
| |
| − | | |
| − | == Limitations ==
| |
| − | | |
| − | This client-side JavaScript solution relies on the end-user's browser enforcing their own security. This makes it a beneficial, but unreliable, means of disallowing your page to be embedded in other pages. The following situations may render the script above useless:
| |
| − | | |
| − | * The user agent does not support JavaScript.
| |
| − | * The user agent supports JavaScript but the user has turned support off.
| |
| − | * The user agent's JavaScript support is flawed or partially implemented.
| |
| − | * The user agent's behavior is modified by a virus or plug-in (possibly without the user's knowledge) in a way that undermines the framekiller script.
| |
| − | | |
| − | In 2010 a paper was published highlighting limitations of current frame-busting techniques and proposing improved version:
| |
| − | | |
| − | <style> html{display : none ; } </style>
| |
| − | <script>
| |
| − | if( self == top ) {
| |
| − | document.documentElement.style.display = 'block' ;
| |
| − | } else {
| |
| − | top.location = self.location ;
| |
| − | }
| |
| − | </script>
| |