我有一个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检查的会话变量。