如何在php中验证请求服务器


how to verify the requesting server in php?

我有一个php页面"server1.com/page1.php"(非真实)和另一个页面"server2.com/page2.php"

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

但是,我如何检查是否从"server2.com/page2.php"调用了"server1.com/page1.php"。

提前感谢

有很多方法可以实现这一点。

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

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

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

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

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

我以前使用过哈希、已知秘密和时间戳来完成这项工作。时间戳是必要的,以确保潜在的窃听者无法在他们选择的任何时间重播此过程。

  • 服务器1获取时间,四舍五入到最接近的分钟
  • 将它与存储在文件中的已知秘密(一个长的随机字符串,比如40个字符)连接起来
  • 取串联字符串的SHA1(或您喜欢的任何哈希系统1
  • 发送到服务器2
  • 服务器2对低于和高于当前时间的四舍五入时间执行相同的处理,这允许服务器时钟出现一些不准确

或者,我会考虑添加用户名的哈希,这样即使可能发生重放攻击,它也会被锁定到一个用户名。

1这些天SHA1听起来有点太快了。password_hash的算法可能会更好,因为它们有意放慢速度——如果你愿意,你可以简单地配置额外的轮次。

让page1.php设置page2.php检查的会话变量。