2012-03-23 60 views
2

我有一个php页面“server1.com/page1.php”(不是真实的)和另一个页面“server2.com/page2.php”如何验证php中的请求服务器?

page1.php响应根据URL传递的参数可以来从任何服务器。

但我如何检查“server1.com/page1.php”是否从“server2.com/page2.php”调用或不。

在此先感谢

+0

说明:server2.com _ itself_正在使用server1.com上的页面,还是从另一个链接到另一个页面,并且它是同时使用它们的用户? – halfer 2012-03-23 17:55:15

回答

4

有很多方法可以实现。

最简单的方法是检查$ _SERVER ['HTTP_REFERER']以查看它是否匹配,但这不是100%可靠,并且不是真正的安全性。

第二种方法是使用PHP的会话功能。这需要两台服务器使用共享会话跟踪区域,这是一个更高级的服务器设置。

第三种方法是使用共享MySQL服务器,这两个服务器都可以访问来验证请求。这会引入延迟,这可能会减慢请求的速度。

第四种方法是使用回呼到始发服务器来验证它是否发出请求。 Server2向Server1发出请求,然后Server1与Server2联系,并询问它刚刚收到的请求是否真的来自它。

第五种方法是使用私钥/公钥对对您的请求进行签名。通过这种方式,您可以确定该请求是否来自它声称的服务器。

1

有page1.php设置会话变量,page2.php检查。

+0

这不适用于两台不同的服务器,除非它们的会话数据库是共享的。 – 2012-03-23 17:46:00

+0

此外,您将不得不使用粗略的URL会话,因为cookie不起作用。 – Brian 2012-03-23 17:49:34

+0

但我无法访问server2.com/page2.php! – fean 2012-03-23 17:53:04

3

我以前做过这个,使用哈希,已知的秘密和时间戳。时间戳对确保潜在窃听者无法在他们选择的任何时间重放此过程是必要的。

  • 服务器1的时候产生,其四舍五入为最接近的分钟
  • 存储在一个文件中已知的秘密串连它(长的随机字符串,说40个字符)
  • 以级联的SHA1字符串(或任何散列系统你喜欢)
  • 发送到服务器2
  • 服务器2做下面和当前时间上面的圆时,它允许在服务器的时钟不准确一些相同的过程。

或者,我会考虑加入用户名的散列,以便即使重放攻击是可能的,它将被锁定到一个用户名。

这些日子SHA1听起来有点太快了。 password_hash的算法可能会更好,因为它们故意慢一些 - 如果你愿意,你可以轻松配置额外的轮。

+0

我想知道更多关于此 – codingbiz 2012-06-10 04:26:49

+0

这里是我的问题 - http://stackoverflow.com/questions/10966398/allow-login-from-another-site/10966496#10966496 - 谢谢 – codingbiz 2012-06-10 12:45:20

相关问题