如何确保HTTP_REQUEST来自正确的地方?

时间:2010-12-30 21:47:45

标签: php security httprequest

我了解到HTTP_REFERER或任何HTTP请求标头可能是伪造的并且不可靠。

REMOTE_ADDR虽然可靠。

那么,如何确保传入的HTTP_REQUEST呼叫来自我列入白名单的网站?

例如,我有一个将从客户端站点发送到服务器的js代码。 (像狙击手,跨平台)。但是,我只允许从几个网站发生这种情况。不是其他人。所以,即使其他人复制代码并放到他们的网站上,它也行不通。

6 个答案:

答案 0 :(得分:3)

在一般情况下,你根本做不到。你完全受客户的支配。你可以通过检查推荐人来使其变得更加困难,但并非不可能。

答案 1 :(得分:2)

可靠地执行此操作的唯一方法是让所有多个网站为每个用户生成唯一令牌,类似于保护自己免受CSRF attacks的攻击。然后,您的脚本会将请求与请求一起发送,您的服务器需要有一种方法来检查令牌与其他网站的真实性。毋庸置疑,除非你控制所有网站,否则这很可能是不可能的。

另见question on HTTP_REFERER

答案 2 :(得分:1)

在实践中没有使用过这个,所以可能存在我不指望的实用性问题,但我认为无论如何我都会提出这个想法。如果我正确解释,这与@Seldaek发布的想法(如果不相同)相似。

  1. 您的服务器为每个页面服务生成一个唯一的ID,并在页面中嵌入ID。
  2. 服务器存储ID和客户端的IP地址。
  3. 客户端上的js将请求中的ID放入服务器并发送请求。
  4. 当服务器收到来自客户端的js请求时,它只响应IP / ID对与文件中的一个匹配(参见#2)。
  5. 在指定时间后(和/或浏览器会话结束),ID / IP条目将过期。
  6. 如果一个人共享访问者的IP地址(可能两者都在同一个NAT盒子后面)实时劫持另一个访问者的会话,这可能是假的,但它至少会阻止某人制作另一个捎带的网页你的服务器的服务。

    如果由于某种原因,访问者的IP地址在提供页面和发送js请求之间发生变化,也可能会出现问题。

    基本上,您的服务器说“我不会为您的js请求提供服务,除非您拥有我最近提供的页面中的数据,并且您(据我所知)来自我服务该页面的位置。 “

答案 3 :(得分:0)

所有http标头都可以伪造。

如果您只是接受来自远程服务器的通信(并且没有将客户端浏览器重定向到您的服务器),那么您可以在该远程服务器与您的服务器之间设置VPN,也可以将防火墙配置更改为仅允许来自特定IP地址集的通信。然而,即使是后者也可能被那些愿意走得那么远的人伪造。

如果客户端浏览器被重定向到您的服务器或从您的服务器加载文件,那么您无能为力。

答案 4 :(得分:0)

正如@Billy所说,这根本不可能,你正在考虑互联网的请求响应机制不正确。

  

例如,我有一个js代码   将从客户端站点发送到服务器。   (像狙击手,十字架   平台)。

我假设您所说的是您在“白名单”上的某个网站上提供了一些javascript代码,这会将用户重定向到您的网站。在您的网站上,您要检查用户是否来自“白名单”网站?

除了设置cookie(可能不可能 - 跨域),你可能会发现它很难。你看过OpenID了吗?如果您可以发布更多详细信息,解决方案可能会更加明显。

答案 5 :(得分:0)

  

所以,我该如何确保传入   HTTP_REQUEST调用来自a   我列入白名单的网站?

我认为如果您签署每个请求(来自白名单),该请求仅对该请求有效(一次)。我假设使用uniqid这是安全的(足够吗?)。