代码之家  ›  专栏  ›  技术社区  ›  m0j0

限制php中的iframe访问

  •  3
  • m0j0  · 技术社区  · 17 年前

    我正在使用PHP创建一个小网页,该网页将从几个站点作为iframe访问。我想限制访问此网站的权限,使其仅在“已批准”的网站内工作,而不是其他网站或直接访问。有人有什么建议吗?这是可能的吗?PHP站点将是Apache,其中包含内容的站点可能是.NET。

    为了澄清,任何站点都可以查看该页面,只要它是在一个批准的站点内的iframe。我想阻止人们直接访问它。我想饼干可能是个解决办法,但我不确定。

    7 回复  |  直到 16 年前
        1
  •  1
  •   Gareth    17 年前

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

    使用javascript,您可以检查页面是否嵌入到另一个框架中,但这并不是简单的,因为在某些人的浏览器中可以关闭javascript。

    例如,如果需要,可以运行以下javascript来重新设置页面:

    if (top.location != location) {
      top.location.href = document.location.href ;
    }
    
        2
  •  1
  •   Tom Ritter    17 年前

    想想这个…我不相信这是完全安全的,但我想这是一个机会-

    唯一能做到这一点的方法是,如果你控制了它将嵌入的站点。如果控制它们,则可以将时间从帧集加密到帧:

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

    然后,php对消息进行解密,以在一个小的增量(比如10秒)内找到时间。因为frame.php知道只有可接受的站点才能加密时间,所以它知道自己可以显示出来。否则,它不会输出任何内容。

    任何其他东西,无论是javascript还是http_-refer,都可以被欺骗、关闭或规避。

    事实上,使用该URL,只要用户在10秒内加载您的帧,攻击者就可以在任何地方显示您的帧。所以攻击者只需刮掉接受的站点,并获取密钥。如果这个威胁模型对你来说是不可接受的——那么你真的无能为力(除了一个更复杂的协议)。

        3
  •  1
  •   Keltex    17 年前

    我会像Google实现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(在浏览器的安全限制范围内)检查文档的属性,以防止未经授权的访问。

        4
  •  1
  •   Rontologist    17 年前

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

    在您的站点上设置访问列表,以仅接受来自已批准的站点Web服务器的请求,并向其颁发安全令牌。这是最容易的部分。

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

    这可能非常复杂,但您可以更好地控制谁访问该站点。此外,您发出的任何安全令牌对Web用户都不可见,因为它只应在两个Web服务器之间传输。

        5
  •  1
  •   Catalin DICU    17 年前

    您可以使用秘密salt+日期对客户端IP进行MD5(或加密以提高安全性),并将其作为参数传递到iframe-src-url中。在iframe中,您执行相同的操作,并检查结果是否与参数相同;如果不相同,则拒绝访问。

        6
  •  0
  •   Darryl Hein IrishChieftain    17 年前

    你能不能查一下 $_SERVER['HTTP_REFERER'] 为了确保它包含一个特定的字符串?

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

    在您的情况下,您可能希望先解析出地址,然后检查 in_array() .

    这不是傻瓜证明,因为人们可以伪造裁判, 但是 也许你可以在两台服务器之间做一些1使用密钥和其他通信。如果钥匙已被使用,则不可使用。

        7
  •  -2
  •   m0j0    17 年前

    谢谢你所有的好主意!我认为我要使用的解决方案是由批准的“iframing”站点设置的会话cookie。有人真的下定决心仍然能够获取内容,但我认为我可以通过在双方都有某种共享秘密的基础上提出一个体面的“秘密”算法来防止大多数的滥用,并让批准的站点设置一个会话cookie,我的PHP站点将读取该cookie。如果cookie是有效的并且符合我的标准,我将显示内容,否则我不会。我保护的信息不是关键任务,我只是试图防止它被滥用。

    推荐文章