我正在努力加强我们的应用程序以跨框架脚本/点击劫持攻击。我们的应用程序托管在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.location
和self.location
值的域名吗?通过这种方式,我可以确保它始终只是构成我们应用程序的同一高级域的父站点。寻找有关正则表达式编码的一点帮助。这种方法听起来不错吗?
答案 0 :(得分: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)
答案 1 :(得分: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测试页。