2015-04-17 65 views
1

我们通常所说的我的用户通过https://www.mycompany.com/go/mybusinessname如何禁用直接访问的iFrame

访问我们的网页,这里面的网页,我们有实际上来自https://www.mycompany.com/myapp

一切正常,只是一个IFRAME如果由于某种原因,用户来了解这个URL https://www.mycompany.com/myapp。他们可以通过在地址栏中输入来直接访问它。

这是我想阻止他们做的事情。有没有最佳做法来实现这一目标?

====更新,以提供更多的背景====

父页面这是https://www.mycompany.com是公司的页面,它是由一些其他的团队维护。所以他们拥有所有的通用页眉和页脚等等,因此每个应用程序都在其内部呈现为一个iframe。 (这也意味着我们无法更改父页面的代码)

如果用户直接访问https://www.mycompany.com/myapp,他们将无法看到页眉和页脚。是的,这不是什么大问题,但我只是想保持一致性。

我的另一个问题是,在我们的开发环境(也就是当在本地运行页面时),我们没有父-iframe的东西。我们直接从http://localhost:port访问我们的页面。因此,我想找到一个解决方案,可以让我们在本地运行时也能正常访问它。

如果这样简单的解决方案不存在,请让我知道还有:)

+0

为什么这很重要? – Quentin

+0

使用Javascript验证自己的IFRAME调用到外部父框架中。名义上这不会直接浏览(我说名义上是因为有足够的努力,任何事情都是可能的)。 – Lloyd

+0

[检测iFrame在Javascript中的嵌入]可能的重复(http://stackoverflow.com/questions/925039/detect-iframe-embedding-in-javascript) – CBroe

回答

0

我意识到我们已经有了一个函数来判断页面是否在https://www.mycompany.com下运行。所以现在我只需要做下面的事情来执行重定向,当我们的页面不是iframe时

var expectedPathname = "/go/mybusinessname"; 
var getLocation = function (href) { 
    var l = document.createElement("a"); 
    l.href = href; 
    return l; 
}; 
if (window == window.top) { // if not iframe 
    var link = getLocation(window.top.location.href); 
    if (link.pathname !== expectedPathname) { 
     link.pathname = expectedPathname; 
     window.top.location.replace(link.href); 
    } 
} 
+0

评估if == window.top和getLocation函数的语句是多余的。 location.href已经返回URL并包含路径名。事实上,你的方式留下了一个安全漏洞。有人可以在他们的网站上伪造名为/ go/mybusinessname的文件,并在iframe中打开“myapp”链接。您最安全的解决方案是评估整个网址并确保它与您公司的网址(或可接受的网址数组)匹配。详情请参阅我的回答。 –

-1

您可以在服务器端使用HTTP referer头。如果页面在IFRAME中打开 - referer包含父页面地址。否则,它是空的或包含不同的页面。

4

在您的iframe的源代码中,您可以使用window.top.location检查父窗口,看它是否设置为'https://www.mycompany.com/go/mybusinessname'。如果不是,请重定向页面。

var myUrl = 'https://www.mycompany.com/go/mybusinessname'; 

if(window.top.location.href !== myUrl) { 
    window.top.location.href = myUrl; 
}