Framekiller

From Wikipedia, the free encyclopedia
Jump to: navigation, search

A framekiller (or framebuster or framebreaker) is a technique used by web applications to prevent their web pages from being displayed within a frame. A frame is a subdivision of a Web browser window and can act like a smaller window. It's usually deployed to prevent a frame from an external Web site being loaded from within a frameset without permission often as part of clickjacking attack.

First framekillers[edit]

Historically, the first framekiller scripts were as simple as this:

<script type="text/javascript">
  if(top != self) top.location.replace(location);
</script>

The logic here was to display the page, but check if the top location is the same as the current page, and replace the top by current if not.

There were many variations of this script. This example is cross-browser compatible, avoids deprecated 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.

Modern framekiller[edit]

In 2010 Gustav Rydstedt, Elie Bursztein, Dan Boneh and Collin Jackson published a paper that highlighted the limitations of current frame-busting techniques and proposed the following improved version:[1]

<style> html{display:none;} </style>
<script>
   if(self == top) {
       document.documentElement.style.display = 'block'; 
   } else {
       top.location = self.location; 
   }
</script>

The logic of this script was to disable presentation of the page by default and enable it only in top location.

Alternative solutions[edit]

An alternative choice is to allow the user to determine whether to let the framekiller work.

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;
};

Framekiller limitations[edit]

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.

See also[edit]

  • Clickjacking - discusses more sophisticated methods to prevent embedding in a frame, such as X-Frame-Options header

References[edit]

  1. ^ G. Rydstedt, E. Bursztein, D. Boneh, C. Jackson (2010). "Busting Frame Busting: a Study of Clickjacking Vulnerabilities on Popular sites". 3rd Web 2.0 Security and Privacy workshop. IEEE.