【问题标题】:Clickjacking remediation via domain name comparison通过域名比较进行点击劫持补救
【发布时间】:2016-02-01 20:51:27
【问题描述】:

我正在努力强化我们的应用程序以应对跨框架脚本/点击劫持攻击。我们的应用程序托管在 iframe 内的多个不同父站点下。这些父站点中的每一个都共享相同的高级域名(例如 *.foo.com)。我希望能够确保父框架站点始终与我们的应用程序域相同。例如:

父网站:apple.foo.com、pear.foo.com、banana.foo.com 我们的网站:mysite.foo.com

我知道我可以通过 Javascript 执行类似的操作,但出于可移植性原因,我不希望将我们的域名嵌入代码中。

<script type="text/javascript">
var topFrameHostname = "";
try
{
                topFrameHostname = top.location.hostname;
}
catch (err)
{
                topFrameHostname = "";
}
if (self !== top && document.referrer.match(/^https?:\/\/([^\/]+\.)?foo\.com(\/|$)/i)) == null && 
                topFrameHostname != self.location.hostname) 
{
                top.location = self.location;
} 
else
{
                var antiClickjack = document.getElementById("antiClickjack");
                antiClickjack.parentNode.removeChild(antiClickjack);
}
</script>

所以我的问题是我可以使用正则表达式来比较top.locationself.location 值中的域名吗?通过这种方式,我将能够确保它始终只是来自构建我们应用程序的同一高级域的父站点。寻找一些关于正则表达式编码的帮助。这种方法合理吗?

【问题讨论】:

  • 首先阅读Same Origin Policy。最好使用X-Frame 标头而不是正则表达式。
  • X-FRAME-OPTION SAMEORIGIN 的问题(无论如何我都理解)它只适用于相同的域名。所以在我上面的例子中,它只有在父母和孩子都是 mysite.foo.com 时才有效。它不适用于共享同一根域 (*.foo.com) 的多个站点。

标签: javascript regex clickjacking


【解决方案1】:

为什么在谈论匹配任何东西时,为什么有人认为正则表达式是唯一的灵丹妙药?
这个怎么样:

function domain(url){
    if(typeof url === "string") url = new URL(url); //sugar, to handle strings
    return url.hostname.split('.').slice(-2).join('.').toLowerCase();
}

domain(top.location) === domain(self.location)

【讨论】:

  • 这是一个不错的方法。感谢分享。
  • 这段代码在 IE 上给了我一个 Permission Denied 错误:return url.hostname.split('.').slice(-2).join('.').toLowerCase();任何想法为什么?
  • 请提供更多上下文。哪个IE版本和什么文件模式?你传递了什么作为 url?位置对象?一个字符串?
  • Internet Explorer 11 和文档模式 7。当点击劫持脚本尝试访问 top.location 时,我认为我遇到了同源策略问题。在调试器中看到此错误:Uncaught SecurityError: Blocked a frame with origin "myframe.foo.com" from access a frame with origin "parentsite.foo.com".
【解决方案2】:

我不得不删除对top.location 的引用并改用document.referrer 以避免权限错误。另外,URL 函数在 IE 中不起作用,所以我只是使用字符串函数来提取和比较 URL:

<style id="antiClickjack">body{display:none !important;}</style>
<script type="text/javascript">
var topFrameHostname = "";
var ref = document.referrer;
var tophld = ref.split("/")[2].split(".").slice(1).join(".");
var selfhld = self.location.hostname.split(".").slice(1).join(".");

try
{
            topFrameHostname = top.location.hostname;
}
catch (err)
{
            topFrameHostname = "";
}
if (self !== top && tophld !== selfhld &&
            topFrameHostname != self.location.hostname)
{
            top.location = self.location;
}
else
{
            var antiClickjack = document.getElementById("antiClickjack");
            antiClickjack.parentNode.removeChild(antiClickjack);
}
</script>

这似乎起到了作用并通过了 clickjack.html 测试页。

【讨论】:

  • 更改此脚本后,我在 IE 中看到了一些非常奇怪的行为。某些页面会有空白框。但是,如果我按 F12 选择开发者工具,我会突然看到框架。这就像 IE 以某种方式隐藏框架。以前有人见过这种行为吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
相关资源
最近更新 更多