2008-10-28 40 views
3

我正在使用PHP创建一个小型网页,它将作为来自几个站点的IFRAME进行访问。我想限制访问本网站只在“已批准”网站内工作,而不是其他网站或直接访问。有没有人有什么建议?这甚至有可能吗? PHP站点将是Apache,并且iframing内容的站点可能是.NET。在PHP中限制IFRAME访问

只是为了澄清,任何网站都可以查看该网页,只要它在经过批准的网站内是iframe。我想阻止人们直接访问它。我认为饼干可能是一种解决方案,但我不确定。

回答

-2

感谢所有伟大的想法!我认为我将要使用的解决方案是由批准的“iframing”网站设置的会话cookie。有人确定仍然能够获得内容,但我认为我可以通过提出一种体面的“秘密”算法来防止大多数滥用,这种算法基于双方的某种共享秘密,并且已批准的站点设置为会话cookie将被我的PHP站点读取。如果cookie有效且符合我的标准,我将显示内容,否则我不会。我所保护的信息不是关键任务,我只是想阻止它被滥用。

1

不幸的是,这是不可能的。

使用Javascript,你可以检查你的页面是否嵌入到另一个框架中,但这不会是万无一失的,因为Javascript可以在某些人的浏览器中关闭。

例如,您可以运行下面的JavaScript重定位你的页面,如果是这样的意向:

if (top.location != location) { 
    top.location.href = document.location.href ; 
} 
+0

我希望有某种类似HTTP_REFERER变量的功能,但我认为没有。 :-( – m0j0 2008-10-28 21:35:52

+0

HTTP_REFERER不能被信任 - 它可以随意更改或隐藏 – 2008-10-28 21:44:42

+0

您也可以使用JavaScript来加载最终页面,以便它们需要启用JS才能使用它,因此您可以使用JS防止它被加载到未经授权的页面 – staticsan 2008-10-29 01:13:25

0

你能不检查$_SERVER['HTTP_REFERER'],以确保它包含某些字符串?

if (strpos('http://example.com', $_SERVER['HTTP_REFERER']) !== false) { 
    // allowed 
} 

你的情况,你可能想先解析出地址,然后检查是否in_array()

这不会是愚蠢的证据,因为人们可以伪造引荐者,但是也许你可以做2种服务器之间的某种其他通信的某种使用密钥。如果钥匙已被使用,则不行。

1

想到这里......我不相信这是完全安全的,但这里有一个镜头,而我觉得它更多 -

你可以做到这一点的唯一方法,就是如果你控制它的网站将嵌入如果你控制他们,你可以打发时间,加密,从框架到框架:

<iframe src="http://yourdomain/frame.php?key=p21n9u234p8yfb8yfy234m3lunflb8hv" /> 

frame.php然后解密消息内的小找出时间三角洲(比如10秒)。由于frame.php知道只有可接受的网站可以加密时间,因此它知道可以自行显示。否则,它不输出任何内容。

不管是javascript还是HTTP_REFER,都可以被欺骗,关闭或规避。

事实上,只要用户在10秒内加载它,攻击者就可以在任何地方显示帧。所以攻击者只会刮掉接受的网站,并抓住钥匙。如果这种威胁模型对你来说是不可接受的 - 那么你确实无能为力(除非是更复杂的协议)。

1

我会以与谷歌实施AdSense相同的方式实现。而不是让他们嵌入自己的网站,iframe代码,而不是让他们嵌入一些JavaScript其中包括账户号码:

<script type="text/javascript"><!-- 
myiframe_client = "12345"; 
myiframe_width = 728; 
myiframe_height = 90; 
//--> 
</script> 
<script type="text/javascript" 
src="http://www.example.com/scripts/show_iframe.js"> 
</script> 

至少这样你可以管理谁在每个帐户基础上显示您的iframe内容。如果有人未经授权尝试使用您的iframe,则可以禁用该帐户。您还可以通过javascript(在浏览器的安全限制范围内)检查文档的属性,以防止未经授权的访问。

1

屏幕抓取可能是一个可能的解决方案。

在您的网站上设置访问列表,只接受来自已批准站点Web服务器的请求,并向他们发放安全令牌。这是很容易的部分。

开发团队在他们的最后需要设置一个中继servlet来获取您的内容,然后将其显示给用户(在重写任何相关的url之后)。

这可能会涉及很多,但您可以更好地控制访问网站的人员。此外,您发布的任何安全令牌都不会对Web用户可见,因为它只应在两个Web服务器之间传输。

1

您可以使用秘密salt +日期将MD5(或加密以提高安全性)客户端IP,并将其作为iframe src url中的参数传递。在iframe中,你做同样的事情,并检查结果是否与参数相同;如果没有,拒绝访问