是否可以在没有脚本的情况下可靠地知道HTTP请求的来源?

时间:2011-08-08 01:48:31

标签: php javascript http http-headers http-referer

我的任务是从我们的服务器提供一个图像文件,该文件在一个驻留在许多其他服务器上的html文档中引用。即:

foo.com上的

文件:
<img src='http://bar.com/image.jpg'>

当用户访问foo.com时,它会显示来自我们服务器bar.com的图像。 (它实际上根据网站发出请求发送了不同的图像。)

但这里有一个问题:他们只希望特定公司的访问者能够检索文件(目前由服务器的域名识别,但这不是必需的。)

在完美的世界中,您只需查看HTTP_REFERER,如果它在批准的列表中,则提供该文件。但是众所周知,并非每个用户代理都提供HTTP_REFERER,无论如何它都可以被欺骗。

最好不要运行javascript或php,但是如果没有脚本编写我们就可以了吗?

如果没有,有没有办法只使用javascript这样做,以至于另一个网站不能欺骗他们下载文件的方式?

如果没有,你会如何使用PHP接近它?

2 个答案:

答案 0 :(得分:4)

简而言之,没有。您拥有的唯一可靠信息是请求图像的IP地址,但即使这可能是代理。没有可靠的方法来确定请求图像的上下文(即图像嵌入到哪个HTML页面中)。

您想要的是仅允许某些人访问该图像。有两种方法可以做到这一点:

  • 通过请求IP地址进行过滤(如果已知)
  • 需要经过身份验证的会话/ cookie /授权标头,即密码保护图像

如果您的网络服务器支持这些检查中的任何一种(几乎任何服务器都可以通过IP过滤请求),则无需编写脚本。对于密码身份验证,您可能必须使用脚本,具体取决于它应该如何工作。

(客户端)Javascript在这里根本不会有任何用处。

答案 1 :(得分:3)

您对已批准公司的网络应用有何影响?如果是这样,我可以想出两种方法来实现这一目标。

使用您的foo / bar示例,其中bar.com是您的服务器,foo.com是您认可的公司之一:

1)代替浏览器向您的服务器发出请求,让他们向foo.com上的图像处理程序发出请求,然后foo.com会在后台向您的服务器发出HTTP请求并将图像内容返回给客户端。 Foo的传出IP地址将位于服务器上的白名单中,因此所有请求实际上都来自Foo的IP地址。客户会看到:

<img src="http://foo.com/imagehandler.php" />

2)更难,但如果Foo无法向您的服务器发出请求,Foo可以在图像标记的查询字符串中放置一个特殊的哈希值,这样当浏览器向您的服务器发出请求时,您就会知道URL是由Foo构建的。你需要Foo服务器上的一个私钥,以便它可以计算哈希值。

我猜测哈希将根据浏览器的IP地址,当前日期/时间和私钥的组合计算。

因此浏览器会向foo.com/default.php发出请求,而Foo会为浏览器构建以下图像标记:

<img src="http://bar.com/imagehandler.php?hash=393923A423B423F234C34" />

其中该数字表示适当的哈希值。在Bar的图像处理程序代码中,您需要根据仅为Foo和Bar知道的私钥,作为GET请求的一部分的IP地址以及当前日期/时间重新计算该散列。如果哈希匹配,那么您可以非常确定浏览器正在查看foo.com的网站,并且您可以返回图像内容。