【问题标题】:$_SERVER['REMOTE_ADDR'] returns false IP$_SERVER['REMOTE_ADDR'] 返回错误 IP
【发布时间】:2013-07-31 10:31:36
【问题描述】:

我正在为我的网站制作一个 anto-fload 脚本。我不能使用任何处理它的服务,比如f​​ail2ban 等。我关于 $_SERVER['REMOTE_ADDR'] 值的问题。 有什么方法可以让这个函数返回一个错误的 IP?我在某处听说这是可能的,我想知道这是怎么发生的,我能做些什么来防止它? 那是我的脚本:

        $ip = $_SERVER['REMOTE_ADDR'];
    $query = "SELECT * from `banned_users` WHERE `ip`='".$ip."'";
    if(mysql_num_rows(mysql_query($query))!=0)die("you have been banned from the site!");

    if(isset($_SESSION['views']) && isset($_SESSION['time']) && $_SESSION['time']>=time()-2)$_SESSION['views']++;
    else {
        $_SESSION['views']=1;
        $_SESSION['time'] = time();
    }   
    if($_SESSION['views']>=15){
        $query = "INSERT into `banned_users` values ('',".time().",'".$ip."') ";
        mysql_query($query);
        die();
    }

如您所见,如果用户在 2 秒内刷新超过 15 次,则会禁止他访问该网站。 我的另一个问题是关于 15 次操作,它是否物有所值?我应该降低它吗?因为我的主机有带宽限制。

谢谢。

【问题讨论】:

  • 我建议你不要写这个脚本。
  • @Bondye 嗨,我说的不是本地主机,除了 IIS6 和 7 之外,还有什么其他原因会导致我得到一个错误的 IP?
  • @YourCommonSense 嗨,我没有得到定义错误。朋友是什么意思?
  • 不,那不可能。
  • 是的,当然有。不,你不能对它做任何事情。

标签: php mysql


【解决方案1】:

REMOTE_ADDR 由 Web 服务器提供给 PHP。它从传入的 IP 请求的地址中获取。

它通常相当准确,但是:

  • 如果有人知道自己在做什么并且真的不想被追踪,则可能会被欺骗。

  • 如果用户通过代理访问站点,它也可能具有误导性值——您将获得的地址将是代理的地址,而不是用户的结束地址。 (您可能会或可能不会获得代理转发地址的其他 $_SERVER 字段,具体取决于代理的配置。您不能相信这是准确的)

  • 如果用户在他们自己的网络中,NAT、防火墙、代理和其他网络系统可能会导致他们认为是他们的 IP 地址的地址可能不是您的站点接收到的地址。对于该网络中的所有用户,您可能只会看到一个 IP 地址或一小部分地址。这将包括许多(大多数)企业(即从他们的办公室拜访您的人),并且可能还包括一些 ISP,这意味着该 ISP 的所有客户可能在您看来都是相同的 IP 地址,并阻止其中一个他们可能会全部屏蔽。

[可以] 得到一些奇怪的数字和点或 NULL 或其他不一定是 IP 的组合吗?

我猜它可能包含一个 IPv6 地址。如果您的代码只希望看到 IPv4 地址,那将是一个问题。但总的来说,它总是是一个有效的 IP 地址(即使它被欺骗了,它仍然需要有效才能让服务器接受连接)。

【讨论】:

  • 非常感谢您的回答,您说您可能没有得到任何 $_SERVER 字段,在我上面写的脚本中是否有可能出现 aa 错误我的意思是某种未定义的值或类似的东西?
  • 您应该使用isset() 来确认已填充值。像REMOTE_ADDR 这样的核心值应该始终存在(只要程序通过网络服务器运行),但其他的可能存在也可能不存在;您的代码应该在使用它们之前进行检查。
【解决方案2】:

有没有什么方法可以让这个函数返回一些奇怪的数字和点的组合或 NULL 或其他不一定是 IP 的东西?

没有。

【讨论】:

    【解决方案3】:

    根据RFC 3875 - The common gateway interfaceREMOTE_ADDR 的值必须设置为 IPv4 或 IPv6 地址:

    4.1.8。 REMOTE_ADDR

       The REMOTE_ADDR variable MUST be set to the network address of the
       client sending the request to the server.
    
       ...
    
       The format of an IPv6 address is described in RFC 3513 [15].
    

    apache SAPI 和 cgi SAPI 旨在符合此 RFC。因此,如果您正在使用它们,则必须将值设置为适当的值,除此之外的任何行为都是错误。

    【讨论】:

      【解决方案4】:

      如果用户在代理后面,您将在 $_SERVER['REMOTE_ADDR'] 中收到此代理 IP(那么真实 IP 应该在 $_SERVER['HTTP_X_FORWARDED_FOR'] 中,但这取决于指定的代理)。

      在其他情况下,我认为来自 $_SERVER['REMOTE_ADDR'] 的 IP 应该是正确的。

      【讨论】:

      • 嗨,感谢您的回答,它给了我一个未定义的索引错误,然后我尝试:$_SERVER['HTTP_X_FORWARDED_FOR'];你能看出这是为什么吗?
      • @Anton.P 就像我说的依赖代理,可以设置也可以不设置。
      猜你喜欢
      • 2015-06-19
      • 2017-01-31
      • 2013-10-19
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      相关资源
      最近更新 更多