【问题标题】:Cloudflare is giving me the wrong IP when I use getenv(REMOTE_ADDR)当我使用 getenv(REMOTE_ADDR) 时,Cloudflare 给了我错误的 IP
【发布时间】:2018-09-17 02:47:41
【问题描述】:

我有一个测试 php 代码。这实质上是抓取某人的 IP 并将其通过电子邮件发送到一个地址。我计划稍后将其存储在数据库中,但出于测试目的,我将其作为电子邮件发送给我。

我的问题是,我启用了 cloudflare,所以当我使用 getenv(REMOTE_ADDR) 时,它给了我 cloudflare 的 IP,而不是实际的访问者 IP。有没有办法获取访问者的IP?

<?php
$ip = getenv(REMOTE_ADDR);
mail("email@domain.com", "You got a visitor", "IP: ".$ip);
?>

【问题讨论】:

    标签: php cloudflare getenv


    【解决方案1】:

    如果您使用的是 Nginx,您也可以在 PHP 参与之前在 Web 服务器级别进行更正,在这种情况下,$ip = getenv(REMOTE_ADDR); 将为您提供访问者的“真实”IP。在 nginx 中,您可以在 nginx.conf 文件中为 Cloudflare 的每个 IP 范围使用 set_real_ip_from XXX 将 Cloudflare 的 IP 列入白名单。

    没有我使用的网络服务器级别修复:

    if ($ip=='') $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
    

    当我在我使用的 Web 服务器级别修复 IP 日志记录问题时:

    if ($ip=='') $ip = $_SERVER['REMOTE_ADDR'];
    

    【讨论】:

      【解决方案2】:

      当然是这样,Cloudflare 通过中介连接(反向代理)向用户隐藏您的服务器真实地址,并且以同样的速率,您会看到代理的 IP 访问页面而不是用户的。

      但他们通过标头CF-Connecting-IPother useful headers Cloudflare generate报告真实IP,以找出用户的真实来源。

      $_SERVER['HTTP_CF_CONNECTING_IP'] 代替getenv(REMOTE_ADDR) 再试一次,看看会发生什么。

      【讨论】:

      • 我已将$ip = getenv(REMOTE_ADDR); 替换为$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];。将报告并查看结果。
      • 那么$ip 只是空的。里面什么都没有
      • 试试$_SERVER['HTTP_CF_CONNECTING_IP']
      • 还应该注意可以被欺骗。请求 IP 应首先验证为 CF 服务器。
      • @user3783243 大多数人不会欺骗。不太担心黑客。
      猜你喜欢
      • 2010-09-15
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多