PHP服务器信息

时间:2010-07-01 15:02:28

标签: php embed global

我正在尝试编写各种网站将嵌入的代码,在我的服务器上调用脚本。该脚本流式传输图像的二进制数据并将其吐入图像标记。

但是,我正在尝试控制谁有权访问该脚本。因此,如果我将我的嵌入代码分发给yourwebsite.com,我想确保请求此脚本的客户端从“yourwebsite.com”获取它。

有什么建议吗?

4 个答案:

答案 0 :(得分:4)

您是否尝试过$_SERVER['HTTP_REFERER']

这大部分时间都可以使用,但请考虑到这一点:

  

REFERER由客户端的浏览器作为HTTP协议的一部分发送,因此确实不可靠。它可能不存在,它可能是伪造的,如果是出于安全原因,你就是不能相信它。

     

如果您想验证某个请求是否来自您的网站,那么您不能,但您可以验证该用户是否已访问过您的网站和/或已通过身份验证。 Cookie是在AJAX请求中发送的,因此您可以依赖它。

     

通过@Seldaek

答案 1 :(得分:2)

最简单的方法是检查引用$_SERVER['HTTP_REFERER']。但这可能是伪造的。

使用某种授权更安全,即

您允许每个客户端看到此图片是唯一的密钥(或盐)。 然后,您的客户必须创建标准化的时间字符串,如20100701170821

然后你的客户可以做这样的事情:

<?php
  $public_identifier = "yourclient.com";
  $secret = "1234567890ABCDFGHIJKLMNOPQRSTUVWXYZ";
  $time_string = date("YmdHis");
  $signature = hash_hmac('sha256',$time_string,$secret)
  $url_to_access_the_images += "?time=$timestring&signature=$signature&client_id=$public_identifier"
?>

这将生成如下的URL:

yourdomain.com/secret_image.php?time=20100701170821&signature=e9de9112433944188b5da9fa7157bf167bfdd6af95120aea2674424838154ea9&client_id=yourclient.com

在您的网站上,您可以像这样进行检查:

<?php
  $secret = get_secret_for_client_id($_GET['client_id']);
  // check if the request time is within a tolerance of 15 minute
  // time difference between client server and your server
  // and check if he's authorized (signature is valid).
  if(abs(int($_GET['time']) - int(date("YmdHis"))) < 1500) &&
     $_GET['signature'] == hash_hmac('sha256',$_GET['time'],$secret)) {
    // do what ever you do to ouput the picture
  } else {
    // do what ever you do for unauthorized access.
  }
?>

答案 2 :(得分:0)

HTTP推荐人

请参阅Determining Referrer in PHP

您可以使用$_SERVER变量:

 $ref = $_SERVER['HTTP_REFERER'];

更多关于HTTP Referrers

答案 3 :(得分:0)

我宁愿使用

$_SERVER['REMOTE_ADDR'];

而不是易于欺骗的REFERER。您可能必须为客户端分配多个IP,但这不应该是一个问题。

如果您不想使用服务器变量,只需分发一个API密钥,让他们在每次请求时将其提交给您的服务脚本。