破坏框架的JavaScript代码 - 执行顺序

时间:2014-05-01 13:23:09

标签: javascript asp.net security scripting clickjacking

我们的代码中存在一个问题,即之前的开发人员试图为框架破坏(停止点击劫持)采取预防性措施,这是一个我没有关注的术语。无论如何,他们将以下代码放在我们所有.aspx页面的顶部,甚至不在其上方的head元素内。

<script type="text/javascript">    
if (self == top) {
    var theBody = document.getElementsByTagName('body')[0]
    theBody.style.display = "block"
} else {
    top.location = self.location
}

所以显然这对安全很重要,问题是我们遇到了问题,因为上面的theBody未定义,因为body标签尚未加载。因此,要停止js代码中断,我们会将上述脚本剪切并粘贴到页面底部。这是一种解决方法。我们只是想知道这种方法是否会使代码首先出现的实际原因无效。任何人都可以给我一些建议吗?

3 个答案:

答案 0 :(得分:2)

阻止Clickjacking的最有效方法是输出具有合适值的X-Frame-Options响应标头,例如DENY

  

X-Frame-Options:DENY

浏览器检查此内容并阻止页面被框起,具体取决于值。

对于不支持X-Frame-Options标题的旧浏览器(例如IE7及更低版本),使用帧破坏JavaScript作为后备。

至于你的身体错误,只有在浏览器在HTML中解释并在DOM中创建它之后,body元素才可用。这就是为什么您的代码在body标签之前执行时会显示错误的原因。您必须询问开发人员为什么使用此代码将正文设置为display:block。默认情况下,CSS中的正文可能是display:none吗?

答案 1 :(得分:2)

我正在研究相同的内容,并发现了这些额外的信息。指定选项DENY将阻止页面被加框。如果我们想要在同一来源的另一个网页中构建页面,我们可以使用SAMEORIGIN选项。相同的来源意味着具有相同的URI方案,主机名和端口号。但是,如果您的域中有任何页面接受任意URL到帧,则DONT使用SAME ORIGIN。它无法减轻攻击。有关详细信息,请参阅this文章。

答案 2 :(得分:0)

好吧,正如其他人已经正确解释的那样,“X-Frame-Options”响应标头将是处理它的有效方法。 但是,如果您希望将帧突发代码作为后备,您可以在 HEAD 元素中执行此操作。

  1. 先应用​​样式
  2. 根据当前窗口是否在最上面删除样式或保留样式(了解页面是否有框架的方法)

<head>
    <!-- other tags -->
    <style id="theBody">
      body{display:none !important;}
    </style>
    <script type="text/javascript">
      if (self === top) {
        var theBody =document.getElementById("theBody");
        theBody.parentNode.removeChild(theBody);
      } else {
        top.location = self.location;
      }
    </script>   
</head>