我们的代码中存在一个问题,即之前的开发人员试图为框架破坏(停止点击劫持)采取预防性措施,这是一个我没有关注的术语。无论如何,他们将以下代码放在我们所有.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
代码中断,我们会将上述脚本剪切并粘贴到页面底部。这是一种解决方法。我们只是想知道这种方法是否会使代码首先出现的实际原因无效。任何人都可以给我一些建议吗?
答案 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 元素中执行此操作。
<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>