【问题标题】:how to verify the requesting server in php?如何在php中验证请求服务器?
【发布时间】:2012-04-08 07:05:16
【问题描述】:

我有一个 php 页面“server1.com/page1.php”(不是真实的)和另一个页面“server2.com/page2.php”

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

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

提前致谢

【问题讨论】:

  • 澄清:server2.com 本身是在消费server1.com上的页面,还是一个链接到另一个,并且是用户同时消费了它们?

标签: php security


【解决方案1】:

有很多方法可以实现。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我以前使用散列、已知秘密和时间戳做过此操作。时间戳是必要的,以确保潜在的窃听者无法在他们选择的任何时间重播此过程。

    • 服务器 1 获取时间,将其四舍五入到最接近的分钟
    • 将其与存储在文件中的已知秘密(一个长的随机字符串,例如 40 个字符)连接起来
    • 获取连接字符串的 SHA1(或您喜欢的任何散列系统1
    • 发送到服务器 2
    • 服务器 2 执行相同的过程,舍入时间低于和高于当前时间,这会导致服务器时钟出现一些不准确。

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

    1 现在 SHA1 听起来有点太快了。 password_hash 的算法可能会更好,因为它们故意变慢 - 如果你愿意,你可以简单地配置额外的轮次。

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这不会在两个不同的服务器上工作,除非它们的会话数据库是共享的。
    • 另外,您必须使用粗略的 URL 会话,因为 cookie 不起作用。
    • 但我无法访问 server2.com/page2.php !
    • @fean:如果 server2.com 不在您的控制之下,您应该在问题中说明这一点。
    猜你喜欢
    • 2013-01-27
    • 2022-06-13
    • 1970-01-01
    • 2017-11-30
    • 2015-10-19
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多