1

我正在为我的网站制作一个 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 次操作,它是否物有所值?我应该降低它吗?因为我的主机有带宽限制。

谢谢。

4

4 回答 4

3

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

它通常相当准确,但是:

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

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

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

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

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

于 2013-07-31T10:50:44.820 回答
1

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

4.1.8。远程地址

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

于 2013-07-31T11:13:49.707 回答
1

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

不。

于 2013-07-31T10:49:58.407 回答
-1

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

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

于 2013-07-31T10:45:20.617 回答