0

我正在努力加强我们的应用程序以应对跨框架脚本/点击劫持攻击。我们的应用程序托管在 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值吗?通过这种方式,我将能够确保它始终只是来自构建我们应用程序的同一高级域的父站点。寻找一些关于正则表达式编码的帮助。这种方法合理吗?

4

2 回答 2

0

为了避免权限错误,我不得不删除对的引用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 测试页面。

于 2016-02-25T21:29:34.983 回答
0

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

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)
于 2016-02-01T23:19:09.307 回答