Javascript帧杀手仍然允许来自自己域的帧?

时间:2014-06-11 18:31:00

标签: javascript css frame clickjacking

我们正在使用X-Frame-Options标头和可能本页描述的JS / CSS设置实现点击劫持保护:

https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet

作为参考,JS / CSS解决方案如下所示:

<style id="antiClickjack">body{display:none !important;}</style>

<script type="text/javascript">
   if (self === top) {
     var antiClickjack = document.getElementById("antiClickjack");
     antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
     top.location = self.location;
   }
</script>

鉴于X-Frame-Options标头在所有现代浏览器中的广泛支持,我想知道我们是否应该保持JS框架杀手的位置。也许只是为了好的措施?如果我们这样做,我们有一个警告,我们使用colorbox从我们自己的域中生成iframe弹出窗口。这可以通过将其设置为SAMEORIGIN来容纳在X-Frame-Options标题中,但我不知道如何修改JS以允许来自同一域的帧而不容易被绕过。

实际上,脚本会比较self === top,如果它们相同,则会从正文样式中删除display:none;。我可以修改条件以检查域名,如下所示:

if (self === top || this.top.location.hostname === 'www.example.com')

但是这会使用可以从框架页面更改的location对象,从而有效地绕过脚本。基本上,我在这里寻找类似于这个贬低建议的东西:

https://stackoverflow.com/a/21900420/998048

所以,2个问题:

1。)是否仍然被认为是最佳实践,甚至是用JS实现帧杀死的必要条件?

2。)如果是这样,是否有更好,更安全的方法来保持JS的位置,但仍允许来自我们自己域的帧?

1 个答案:

答案 0 :(得分:1)

我仍然使用Javascript方法,因为我的设置不允许我使用服务器端语言。

  

但是这使用了可以从中更改的位置对象   框架页面

怎么样?如果更改了位置对象,则浏览器会将您重定向到新的位置对象。如果在顶部窗口中更改了location.hostname,它将重定向到您的网站。但是,我建议使用父级而不是顶级 - 否则其他帧中的所有帧都可能会重定向到自己。

如果用户已禁用JS,则不会发生这种情况,因此继续使用X-Frame-Options可能是个好主意。但是对于那些不关心X-Frame-Options标题的浏览器,请保持JS解决方案。