如何暂时阻止用户

时间:2011-07-21 21:21:43

标签: php block conditional-statements visitor

我想在每100个视图中阻止访问者2到5分钟..如果用户在2到5分钟之间查看100页然后阻止用户,如果用户在6分钟内查看100个视图,则不要阻止并重置计数器。

我已经创建了计数器脚本,但我遇到了创建可以阻止2-5薄米之间的访问者的功能的问题。

我需要帮助来解决这个问题...我尝试创建一个if条件但没有运气..请帮助我...

 $sb_current_time = date("Y-m-d H:i:s", Time());
/////////////////// Cookies Encryption //////////////
function encrypt($text)
{
    $key = "E4HD9h4DhS23DYfhHemkS3Nf"; // 24 bit Key
    $iv = "fYfhHeDm"; // 8 bit IV
    $bit_check = 8;
    $text_num = str_split($text, $bit_check);
    $text_num = $bit_check - strlen($text_num[count($text_num) - 1]);
    for ($i = 0; $i < $text_num; $i++) {
        $text = $text . chr($text_num);
    }
    $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', '');
    mcrypt_generic_init($cipher, $key, $iv);
    $decrypted = mcrypt_generic($cipher, $text);
    mcrypt_generic_deinit($cipher);
    return base64_encode($decrypted);
}
//////////////// Encription end /////////

////// Cookies decription /////
function decrypt($encrypted_text)
{
    $key = "E4HD9h4DhS23DYfhHemkS3Nf"; // 24 bit Key
    $iv = "fYfhHeDm"; // 8 bit IV
    $bit_check = 8;
    $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', '');
    mcrypt_generic_init($cipher, $key, $iv);
    if ($encrypted_text != "") {
        $decrypted = mdecrypt_generic($cipher, base64_decode($encrypted_text));
        mcrypt_generic_deinit($cipher);
        $last_char = substr($decrypted, -1);
        for ($i = 0; $i < $bit_check - 1; $i++) {
            if (chr($i) == $last_char) {
                $decrypted = substr($decrypted, 0, strlen($decrypted) - $i);
                break;
            }
        }
    }
    return $decrypted;
}
///////// Coookies decription end /////////////////


//$sb_check_ban_time = date($sb_current_time, strtotime("+20 minute"));
if ($_COOKIE['spamer_check_time'] == "") {
    setcookie('spamer_check_time', encrypt(time()));
}
function time_deff($date2)
{
    $date1 = time();
    //sleep(2000);
    //   $date2 = decrypt($_COOKIE['spamer_check_time']);
    //echo $date2;
    $mins = ($date1 - $date2) / 60;
    //echo $mins;
    return $mins;
}


//$sb_cookie_expiration = time() + 1200;
//echo $sb_cookie_expiration;
if ($_COOKIE['view2'] != "") {
    $explod = explode("-", decrypt($_COOKIE["view2"]));
}
$i_print = $explod[0];
// $i2=$explod[1];
//echo $i2;
$i = 1 + $i_print;
setcookie("view2", encrypt($i . "-123456789")); //// Need to add extra bit to block unwanted text and secure the cookes more..
//
$i = $i++;
//  echo $i_print;
   //echo "empty".decrypt($_COOKIE["spamer_check_time"]);
$spammer_blocker = decrypt($_COOKIE["spammer_blocker"]);
// or $spammer_blocker==""
$mins = time_deff(decrypt($_COOKIE['spamer_check_time']));
  $diff_time = .1; /// User BLock Time
  if ($mins >=1 or $mins <=2) {
    $block_user=1;
  } elseif ($mins >= 2.1) {
    $block_user=2;
  } else {

  }
/*  if (.2>$mint) {
    // echo "not done";
    $block_user=0;
  } elseif (.2 <= $mint) {
    echo "block User";
    $block_user=1;
  } elseif ($mins>=1) {
    echo "reset cookies";
    $block_user=2;
  }*/
if ($block_user==1 and $i_print >= 15) {

    if ($spammer_blocker == "") {
        setcookie("spammer_blocker", encrypt(time()));
        header('HTTP/1.1 403 Forbidden');
          $time_rev = $diff_block_time - $diff_time;
            $round_time = round($time_rev, 2);
            $time_reverse = str_replace('-', '', $round_time);
            echo "Wait " . $time_reverse . " Minuts before using this site..";
        exit(0);
    } else {

        //$sb_check_ban_time = $spammer_blocker;
        $diff_block_time = time_deff($spammer_blocker);
        //echo $diff_block_time;
        //$sb_check_ban_time = date($spammer_blocker, strtotime("+1 minute"));
        if ($diff_time <= $diff_block_time) {
            ///  echo "Delete the IP and cookies";
            setcookie("spammer_blocker", "");
            setcookie("view2", "");
            setcookie("spamer_check_time", "");
        } else {
            //echo "Still Block"; ///  echo "Still Block";
             header('HTTP/1.1 403 Forbidden');
      //  echo "IP Block for Spaming wait few mint";

            $time_rev = $diff_block_time - $diff_time;
            $round_time = round($time_rev, 2);
            $time_reverse = str_replace('-', '', $round_time);
            echo "Wait " . $time_reverse . " Minuts before using this site..";
    exit(0);
        }

    }
} elseif ($block_user==2) {
    setcookie("spammer_blocker", "");
            setcookie("view2", "");
            setcookie("spamer_check_time", ""); 
            echo "cookies reset";
} else {

    }

4 个答案:

答案 0 :(得分:3)

首先,你需要知道他们是谁......

对于临时用户,您可以依赖Cookie。但是如果你遇到了滥用者的问题,那么他们就会忽略你阻止他们而不发送cookie的尝试。

知道“有谁”是有不同程度的。

  1. 网址中的ID
  2. 缓存
  3. IP地址
  4. 他们可以用不同程度的不同程度来克服......

    1. 方式太简单了(只是欺骗不同的ID等等)
    2. Cookie与#1
    3. 相同
    4. 除非您拥有僵尸网络或类似的
    5. ,否则IP地址难以克服

      对于您的情况,您可能会阻止IP地址,因为这是您完成所需工作的唯一合理方式。

      -

      接下来,您需要能够跟踪他们的连接。 Linux中的iptables有一种方法可以跟踪连接数,并在达到certian阈值后阻塞特定的分钟数。

      仅使用PHP,您需要记录每次点击以及该点击的IP地址。 SQL数据库将是更有效的方法之一。

      如果你不关心历史,那么简单地说(mysql):

      INSERT INTO HitTable SET IP=..., Visits=1
      ON DUPLICATE KEY UPDATE Visits=Visits+1
      

      后台crontab可以每分钟运行一次这样的查询吗?

      UPDATE HitTable SET Visits = Visits - 10
      DELETE FROM HitTable WHERE Visits < 1
      

      最后,当访问者访问时,您将检查数据库表中的

      SELECT Visits<100 WHERE IP=...
      

      如果返回True,则让它们进入,否则阻止它们。

      希望这有点帮助。

答案 1 :(得分:1)

  1. 在cookie中存储超时值对于用户更改/删除cookie绝对是微不足道的
  2. 将它存储在会话变量中会更可靠,但同样 - 用户可以删除会话cookie,开始新会话,然后重新开始阅读。
  3. 话虽这么说,你会做这样的事情:

    <?php
    
    session_start();
    
    if (user_should_be_blocked()) {
       $_SESSION['blocked_start_time'] = time();
       header("Location: timeout.html");
    }
    
    if ($_SESSION['blocked_start_time'] > (time() - 300)) {
       header("Location: timeout.html");
    }
    
    // got here, must not be blocked and/or timeout has expired
    $_SESSION['blocked'] = false;
    $_SESSION['block_start_time'] = null;
    
    .... continue on
    

答案 2 :(得分:1)

我会使用标题功能将它们重定向到另一个页面,要么是空的,要么只是更少的bankwidth密集度(假设这就是你无论如何都要这样做的原因)。像......一样......

if ($block_user == 1)
    header("Location: blockPage.php");

在您需要阻止的所有页面的顶部。

答案 3 :(得分:0)

编辑:实际上,想到它,(2)当然没有必要,如果登录2个人或2台计算机,他们只会更快地消耗他们分配的观点数量。

您可以这样做:

  1. 用户需要登录才能看到这些页面。
  2. 您不允许使用不同的会话登录两次相同的用户(名称)。
  3. 您存储每个用户的计数,而不是每个会话或每个IP /无论如何。
  4. 基于默认文件的会话无法使用

    (2)。需要自定义数据库或其他持久存储解决方案,您可以在其中扫描当前用户ID的其他会话ID。在数据库中,您只需存储一个user-id字段,也可以构建自定义memcached解决方案等。为了防止用户被锁定在会话之外,他们不再拥有我的解决方案总是要销毁用户拥有的任何旧会话他们登录的那一刻。实际上,如果尝试使用多个会话/ ips,他们将不得不一次又一次地登录,使前一个会话无效。

    (3)再次使用时间戳+用户ID +计数的某些持久存储(在MySQL的情况下为INSERT INTO tablename (user_id,time,count) VALUES (<id>,NOW(),1) ON DUPLICATE KEY UPDATE count=count+1,可以轻松增加视图计数。

    在每个视图上一次又一次地查询数据库,了解访问者在过去X分钟内有多少次观看。