PHP - 当域的IP专用时检查域是不是与服务器的IP匹配

Posted

技术标签:

【中文标题】PHP - 当域的IP专用时检查域是不是与服务器的IP匹配【英文标题】:PHP - check if domain matches server's IP when domain's IP is dedicatedPHP - 当域的IP专用时检查域是否与服务器的IP匹配 【发布时间】:2016-12-19 12:44:16 【问题描述】:

我有一个远程登录脚本,用户在他的服务器上托管(运行)。在注册期间,用户需要指定他将登录的域。当用户在他的域上运行脚本并第一次登录到我的服务器时,我使用以下命令记录他的 IP:

$ip_address = $_SERVER['REMOTE_ADDR'];

当用户第二次登录时,我检查他的 IP 地址是否仍然相同(使用上述相同的功能)。然后我检查他是否仍然使用相同的域:

$domain = $_SERVER['HTTP_REFERER'];

最后,除了其他安全检查之外,我还使用以下方法检查指定域是否真的指向 IP 地址:

$domain_ips_array = gethostbynamel($domain);
if (in_array($ip_address, $domain_ips_array)) 
    echo "Wonderful, domain really points to this IP";

但是当域指向专用 IP 时就会出现问题。例如,如果服务器的 IP(实际托管脚本的位置)是 1.1.1.1(此 IP 也由 $_SERVER['REMOTE_ADDR'] 返回),但域配置为使用专用 IP 1.1.1.2,gethostbynamel 函数将只返回 1.1.1.2,检查将失败(即使域实际上托管在 IP 地址为 1.1.1.1 的服务器上)。

我该如何解决这个问题?简而言之,我需要确保用户始终在同一个 IP/域上运行脚本,如果其中任何一个发生更改,就会显示警报。

【问题讨论】:

你给用户脚本了吗? 是的,用户在他的服务器上运行脚本。所有脚本文件都经过编码。 现在我想到了一个想法,如果我能够获得安装脚本的位置,我可以消除检查域是否与特定 IP 匹配的需要。当然,如果脚本安装在 userdomain.com/script/ 上,我可以在脚本本身中获取当前 URL,并将其发送到我的服务器。但是这种方式很容易受到攻击,因为用户可以在将数据发送到我的服务器之前以某种方式修改数据。因此,如果我的服务器有任何方法可以看到来自 userdomain.com/script/ 的请求(就像我可以看到实际的 IP 地址)而不将其存储在我的脚本中并且不使用 $_SERVER['HTTP_REFERER']? 【参考方案1】:

我认为重构一点发送给用户的脚本会更好。

例如,当第一次登录出现时,您可以看到来自所请求服务器的 IP。

发挥你的作用,将 IP 返回给你的脚本。然后将其存储在某个地方,然后始终发送。

这样您将始终拥有第一个 IP。然后检查$_SERVER 变量。域可以更改,我认为它不是那么可靠。

说得更简单,你需要把它存储在某个地方。

-编辑

您可以使用函数gethostbyaddr。

这将返回 IP 的域。因此,您也可以存储第一个请求的域,然后相互检查。

【讨论】:

好吧,在这种情况下,我什至不需要修改脚本,因为我已经在我的服务器上存储了用户 IP;因此,我不需要在脚本中存储相同的 IP(当用户第 N 次登录时,我总是可以将他的服务器的 IP 与存储在我的数据库中的 IP 进行比较) 好吧,但我仍然想检查实际域是否真的指向该 IP。所以我们回到原来的问题...... :) 感谢编辑和更新的解决方案。我已经考虑过这一点,但它会导致更多问题 - 如果域托管在共享 IP 上,gethostbyaddr 将返回服务器的主机名(不是域),类似于 servername.com 希望您能找到解决办法。我会感兴趣地关注它。

以上是关于PHP - 当域的IP专用时检查域是不是与服务器的IP匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何使用php获取域的托管IP和国家名称

php 使用PHP CLI检查域的过期日期

计算机无法加入域的终级解决方法

更新域的hosts文件[关闭]

检查 NFS 共享是不是在 PHP 中启动

在具有多个域的同一服务器上托管 PHP 和 Node.js 应用程序