$ _SERVER ['REMOTE_ADDR']返回false IP

时间:2013-07-31 10:31:36

标签: php mysql

我正在为我的网站制作一个anto-fload脚本。我无法使用任何处理它的服务,如fail2ban和他的喜欢。关于$ _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个操作,这是一个很好的价值吗?我应该降低它吗?因为托管我有带宽限制。

感谢。

4 个答案:

答案 0 :(得分:3)

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

通常相当准确,但是:

  • 如果有人知道他们在做什么并且真的不想被追查,那可能会被欺骗。

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

  • 如果用户位于自己的网络中,则NAT,防火墙,代理和其他网络系统可能会导致他们认为的地址,因为他们的IP地址可能不是您网站收到的地址。您可能只会看到该网络中所有用户的单个IP地址或小范围的地址。这将包括许多(大多数)企业(即从他们的办公室访问您的人),也可能包括一些ISP,这意味着该ISP的所有客户可能在您看来是相同的IP地址,并阻止其中一个他们可能会阻止他们。

  

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

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

答案 1 :(得分:1)

  

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

没有

答案 2 :(得分:1)

根据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。因此,如果您正在使用它们,值必须设置为正确的值,除此之外的任何行为都将是一个错误。

答案 3 :(得分:-1)

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

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