<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Colin,<br>
      <br>
      If you are using CSP then you definitely have a browser that
      supports X-Frame-Option headers (or you can use CSP's Clickjacking
      defense). In this case the JavaScript defense would be
      unnecessary.<br>
      <br>
      For browsers that support XFO headers (the best Clickjacking
      defense if your browser supports it), please see 
      <a class="moz-txt-link-freetext" href="https://developer.mozilla.org/en-US/docs/The_X-FRAME-OPTIONS_response_header">https://developer.mozilla.org/en-US/docs/The_X-FRAME-OPTIONS_response_header</a>
      (XFO landed in Firefox
      <meta charset="utf-8">
      <span style="color: rgb(51, 51, 51); font-family: 'Lucida Grande',
        'Lucida Sans Unicode', 'DejaVu Sans', Lucida, Arial, Helvetica,
        sans-serif; font-size: 14px; font-style: normal; font-variant:
        normal; font-weight: normal; letter-spacing: normal;
        line-height: 22px; orphans: 2; text-align: left; text-indent:
        0px; text-transform: none; white-space: normal; widows: 2;
        word-spacing: 0px; -webkit-text-size-adjust: auto;
        -webkit-text-stroke-width: 0px; background-color: rgb(255, 255,
        255); display: inline !important; float: none;">3.6.9<span
          class="Apple-converted-space">, CSP landed in FireFox 4.0 -
          and XFO landed first in every other browser).<br>
          <br>
          I read both articles you sited below. </span></span>
      <meta charset="utf-8">
      "Busting Frame Busting" is an excellent article. It shows how
      almost every common JavaScript framebusting technique was
      "busted". Please note, I talked to the Stanford team before
      supporting the current JS/CSS framebusting defense mechanism on
      the cheat sheet. The team was not able to defeat the defense
      methods of this nature. No one has, that I know of, and I looked.
      (Dear Stanford team, I still owe you Irish Whiskey, I'll honor
      that soon).<br>
      <br>
      Also, for legacy browser clickjacking support, you NEED a method
      that has inline JavaScript in the <HEAD> for legacy browsers
      (the purposes of manual JS clickjacking defense) to prevent the
      page from being Clickjacked while the JS is being loaded.<br>
      <br>
      This is complex stuff - happy to keep the conversation going if I
      missed anything.<br>
      <br>
      Thanks for jumping in here Colin. <br>
      <br>
      Respectfully,<br>
      <br>
      Jim Manico<br>
      @Manicode<br>
      (808) 652-3805<br>
      <meta charset="utf-8">
      <br>
      <br>
    </div>
    <blockquote
cite="mid:CAAxdBBnkmyMewrhJBF_QW7NTBMpESchA9J+FbVNz0pz73Z4zYw@mail.gmail.com"
      type="cite">
      <pre wrap="">Jim

This is a very welcome addition to the cheat sheet series. It may be
worth referencing the following papers for further reading:

   Clickjacking Attacks Unresolved
   <a class="moz-txt-link-freetext" href="https://docs.google.com/document/pub?id=1hVcxPeCidZrM5acFH9ZoTYzg1D0VjkG3BDW_oUdn5qc">https://docs.google.com/document/pub?id=1hVcxPeCidZrM5acFH9ZoTYzg1D0VjkG3BDW_oUdn5qc</a>

   Busting Frame Busting: A Study of Clickjacking Vulnerabilities on
Popular Sites
   <a class="moz-txt-link-freetext" href="http://seclab.stanford.edu/websec/framebusting/framebust.pdf">http://seclab.stanford.edu/websec/framebusting/framebust.pdf</a>

Regarding "Defending legacy browsers", the example code requires the
use of inline JavaScript. This might not be compatible with a more
robust Content Security Policy header. I have used a linked JS file in
the header e.g.

   <script src="/resources/scripts/site.js" type="text/javascript"></script>

and in that file use the init() function to call something similar as
already presented. I don't suggest the following is optimal, or
currently matched to recent browsers. This dynamically adds the
"hidden" style as a header, and then changes that. It relies on the
timing of the page init event.

= /resources/scripts/site.js ==============

function start(){

        var fileref=document.createElement("link")
        fileref.setAttribute("rel", "stylesheet")
        fileref.setAttribute("type", "text/css")
        fileref.setAttribute("href", '/resources/styles/noframe.css')
        document.getElementsByTagName("head")[0].appendChild(fileref)
        if (self == top) {
                document.documentElement.style.visibility = 'visible';
        }
        else {
                top.location = self.location;
        }
        
}


function init() {
    // quit if this function has already been called
    if (arguments.callee.done) return;

    // flag this function so we don't do the same thing twice
    arguments.callee.done = true;

    // kill the timer
    if (_timer) clearInterval(_timer);

    // do stuff
        start();
};

/* for Mozilla/Opera9 */
if (document.addEventListener) {
    document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
        document.write('<script id="__ie_onload" defer src=""><\/script>');
    var script = document.getElementById('__ie_onload');
    script.onreadystatechange = function() {
        if (this.readyState == "complete") {
            init(); // call the onload handler
        }
    };
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
    var _timer = setInterval(function() {
        if (/loaded|complete/.test(document.readyState)) {
            init(); // call the onload handler
        }
    }, 10);
}

/* for other browsers */
window.onload = init;

= /resources/styles/noframe.css ==============

html {
        visibility:hidden;
}

=======================================

And I think it may not be compatible with a strict CSP header
implemented as "X-WebKit-CSP" in Chrome & Safari. I am sure this could
be improved by someone more able than me, but in any case I think we
should make example code CSP-friendly.

Colin


On 25 November 2012 23:48, Jim Manico <a class="moz-txt-link-rfc2396E" href="mailto:jim.manico@owasp.org"><jim.manico@owasp.org></a> wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">The JS/CSS Clickjacking defense is made for legacy browsers that do not
support X-Frame-Option headers.

Per <a class="moz-txt-link-freetext" href="https://www.codemagi.com/blog/post/194">https://www.codemagi.com/blog/post/194</a> it looks like IE6 and FF3x are
supported.

Aloha,
Jim


</pre>
        <blockquote type="cite">
          <pre wrap="">Looks good - has anyone tried the JavaScript to make sure it works?

thanks,
Andrew

On Mon, Nov 26, 2012 at 9:10 AM, Jim Manico <a class="moz-txt-link-rfc2396E" href="mailto:jim.manico@owasp.org"><jim.manico@owasp.org></a> wrote:
</pre>
          <blockquote type="cite">
            <pre wrap="">
Leaders,

I took the Clickjacking Defense Cheatsheet out of draft mode. Can you
take a
look?

<a class="moz-txt-link-freetext" href="https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet">https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet</a>

Your feedback and wiki edits are always appreciated.

Aloha,
Jim Manico
@Manicode
OWASP Volunteer
_______________________________________________
OWASP-Leaders mailing list
<a class="moz-txt-link-abbreviated" href="mailto:OWASP-Leaders@lists.owasp.org">OWASP-Leaders@lists.owasp.org</a>
<a class="moz-txt-link-freetext" href="https://lists.owasp.org/mailman/listinfo/owasp-leaders">https://lists.owasp.org/mailman/listinfo/owasp-leaders</a>
</pre>
          </blockquote>
        </blockquote>
        <pre wrap="">

_______________________________________________
OWASP-Leaders mailing list
<a class="moz-txt-link-abbreviated" href="mailto:OWASP-Leaders@lists.owasp.org">OWASP-Leaders@lists.owasp.org</a>
<a class="moz-txt-link-freetext" href="https://lists.owasp.org/mailman/listinfo/owasp-leaders">https://lists.owasp.org/mailman/listinfo/owasp-leaders</a>
</pre>
      </blockquote>
    </blockquote>
    <br>
  </body>
</html>