【问题标题】:Restrict multiple page access by a user from the same IP [closed]限制来自同一 IP 的用户的多页访问 [关闭]
【发布时间】:2012-05-10 17:25:38
【问题描述】:

我正在编写一个脚本,它将限制特定用户从给定 IP 地址进行多次访问。换句话说,给定用户只能从同一 IP 地址访问/查看该页面一次。

但是我如何比较传入的 IP 来检测这种访问?

我想最多跟踪 60 天的 IP。

【问题讨论】:

  • 将 IP 保存在数据库中,当用户到来时进行查找,并根据匹配将他/她重定向到合适的页面
  • 没有数据库可以做到吗?

标签: php mysql ip


【解决方案1】:

您需要将 IP 存储在某个数据库或平面文件中以进行比较。

假设您有一个 MySQL 表 visits,如下所示:

`ip` varchar(255) NOT NULL,
`date_created` datetime NOT NULL,
`last_visit` datetime NOT NULL,
`visits` int(255) NOT NULL,
PRIMARY KEY (`ip`)

使用PHP我们可以获取用户的IP,在数据库中创建或更新一条表记录,然后做一些比较。

<?php

// Get the user's IP
$ip = getenv('REMOTE_ADDR');

// Create a database record, or update if they're been here before
$dblink = mysql_connect( 'localhost', 'username', 'password' );
mysql_select_db( 'database', $dblink );
$rs = mysql_query( "INSERT INTO visits (ip, date_created, last_visit, visits) VALUES( '$ip', NOW(), NOW(), 1 ) ON DUPLICATE KEY UPDATE `last_visit` = NOW(), visits=visits+1 ", $dblink );

// Compare database record for last visit and first visit
$rs = mysql_query( "SELECT visits, DATEDIFF( last_visit, date_created ) as sincelast FROM visits WHERE `ip` = '$ip' ");
$row = mysql_fetch_assoc( $rs );

// If this is their first visit, do one thing, otherwise, do another.
if ( $row['sincelast'] > 59 || $row['visits'] < 2 ) {
    // They visited 60+ days ago, or this is their first visit
} else {
    // This is not their first visit
}

【讨论】:

    【解决方案2】:

    首先,不同的计算机/用户可以并且确实共享一个 IP 地址。您可能会阻止很多人访问您的网站,因为他们工作场所的某个人也访问了您的网站。话虽如此,这是我的答案。

    您标记了MySQL,因此创建一个名为“ips”的表 - 或类似的名称。

    • 身份证
    • IP
    • 最后一次访问

    每当有人访问您的网站时,请检查是否在此表中找到了他们的 IP 地址,以及 lastAccess 日期是否在今天的 60 天内。如果是,则拒绝或重定向请求。如果他们的 IP 不在表中,或者日期从今天起超过 60 天,则插入/更新表以包含他们的 IP 和当前时间,然后允许他们查看请求的页面。

    这不需要在数据库中完成,您可以在平面文件系统中执行类似的逻辑。但是,您将有很多文件打开、读取、写入,这可能有点令人沮丧,因为您可能会在当前尝试读取文件时尝试写入文件。

    【讨论】:

      【解决方案3】:

      如果您坚持这样做并且不使用数据库,那么您可能希望将访问数据存储在文件中并访问它以检查 ip 的首次访问时间。当然,这与理论上使用数据库几乎相同。

      执行我上面建议的示例函数: (请注意,这样使用起来非常粗糙且不可靠)

      function allowedIP() {
          $vFile = 'vfile'; // file to store visitor data
          $revisit = 3600*24*60; // not allowed time in seconds
          $now = time(); // visit time
          $vIP = ip2long( $_SERVER['REMOTE_ADDR'] ); // get the ip and convert to long
          $vData = ( file_exists( $vFile ) ) ? 
              unserialize( file_get_contents( $vFile ) ) : array(); // get the visit data
          if( ! isset( $vData[$vIP] ) || $now - $vData[$vIP] > $revisit ) {
              // first visit or 60 days passed since the first visit
              $vData[$vIP] = $now; // store the visit time
              file_put_contents( $vFile, serialize( $vData ) ); // save to file
              return true;
          }
          return false;
      }
      

      这个函数的用法如下:

      if( ! allowedIP() ) { /* ip is not allowed, notify the visitor and don't proceed */  }
      

      【讨论】:

        【解决方案4】:

        您需要在某处查找 IP 列表,因此您可以使用表格或将其写入文件,然后进行相应读取

        【讨论】:

        • 基本答案,但几乎不值得投反对票。
        • 我也对反对票感到震惊。我做错了什么?
        【解决方案5】:

        用户$_SERVER['REMOTE_ADDR'] 获取用户的IP,但这不是最好的方案,因为使用同一个代理的多个用户将在您的服务器上显示为一个IP = 一个用户。然后将其存储在数据库中。

        一个更好的主意是在用户的浏览器上设置一个 cookie,告诉您他们已经访问过。不过,他们可以作弊。但他们也可以通过使用不同的代理来欺骗 IP。

        【讨论】:

          【解决方案6】:

          这是一个很大的问题,但是 - IP 并不是机器或人所独有的。那么这是什么逻辑呢?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-15
            • 2017-08-18
            相关资源
            最近更新 更多