【问题标题】:$_SERVER['REMOTE_HOST'] empty for some users$_SERVER['REMOTE_HOST'] 对于某些用户为空
【发布时间】:2015-03-03 23:46:40
【问题描述】:

我已经激活了

HostnameLookups Double

在我的 Apache2 配置中,这样我就可以存储用户的远程主机并确保他们的 IP 地址是真实的而不是伪造的。

但是,我注意到对于我的很多“用户”(输入表单的人)来说,$_SERVER['REMOTE_HOST'] 只是空的(而对于大多数其他人来说,它是非空的),尽管有上述配置。这是否意味着这些用户具有欺骗性 IP 地址,或者这些用户仍然是诚实的普通用户?还有什么可以解释的?

【问题讨论】:

  • 使用remote_addr怎么样?

标签: php spoofing server-variables


【解决方案1】:

不是每个主机都有主机名:)

您可能想使用'REMOTE_ADDR'

【讨论】:

  • 使用$REMOTE_HOST=$_SERVER['REMOTE_HOST'] ?? $_SERVER['REMOTE_ADDR'];gethostbyaddr($_SERVER["REMOTE_ADDR"])
【解决方案2】:

就用这个吧:

if(isset($_SERVER['REMOTE_HOST'])){//check
    $ip = $_SERVER['REMOTE_HOST'];
}else{
    $ip = $_SERVER['REMOTE_ADDR'];//else assign the real IP
}
echo $ip;

【讨论】:

  • REMOTE_HOST 服务器变量用于 IP/主机名验证,而不是用于查找客户端的 IP 地址。
【解决方案3】:

引用自 Apache 文档:

值 Double 是指进行双反向 DNS 查找。那是, 执行反向查找后,然后进行正向查找 根据该结果执行。至少有一个 IP 地址在 正向查找必须与原始地址匹配。 (在“tcpwrappers”中 术语,这被称为偏执狂。)

我怀疑如果正向查找不匹配,则该字段为空。

正如@avnr 所说,IP 地址并不总是有 PTR 记录。

并且在任何情况下都不能确保 IP 没有被欺骗,它只是确保原始 IP 的 DNS 配置具有 PTR 和 A 记录匹配。

【讨论】:

  • 嗯...我将如何确保 IP 不被欺骗呢?如果重要的话,我已经在 https 上了。
  • 您无法确保 IP 是真实的。通常,攻击者会进行欺骗以避免被您的服务器回答拒绝,或者它可能会欺骗某个 IP,在您的服务器(以及其他服务器)的帮助下对该 IP 进行 DOS。
  • 对于论坛帖子的情况,他可能会欺骗发送垃圾邮件,并在查看其“欺骗”发送的正确结果后返回其真实地址(或代理地址)。
【解决方案4】:

试试这个

$ip = getenv('REMOTE_ADDR');而不是 $_SERVER['REMOTE_ADDR'];

 getenv() is used to get the value of an environment variable in PHP
 $_SERVER is an array contains server variables created by the web server.

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 2011-01-29
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2018-08-09
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多