Как временно заблокировать пользователя

Я хочу блокировать посетителя от 2 до 5 минут через каждые 100 минут. Если пользователь просматривает страницу 100 в течение 2-5 минут, то блокирует пользователя, если пользователь просматривает страницу 100 за 6 минут, не блокируйте и не сбрасывайте счетчик.

Я уже создал счетчик сценарий, но у меня проблема с созданием функции, которая может блокировать посетителя между 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 ответа

Решение

Во-первых, вам нужно знать, кто они...

Для случайных пользователей вы можете положиться на куки. Но если у вас возникли проблемы с обидчиком, они просто проигнорируют вашу попытку остановить их и не отправят cookie.

Существуют различные уровни знания того, кто является кем-то.

  1. ID в URL
  2. Печенье
  3. Айпи адрес

И их ВСЕ можно преодолеть на разных уровнях сложности...

  1. Слишком просто (просто подделать другой идентификатор и т. Д.)
  2. Cookies такие же, как # 1
  3. IP-адреса сложнее преодолеть, если у вас нет ботнета или аналогичного

В вашем случае вам, вероятно, следует заблокировать IP-адрес, так как это единственный разумный способ выполнить то, что вы ищете.

-

Далее вам необходимо иметь возможность отслеживать их соединения. iptables в Linux есть способ отслеживать количество соединений и блокировать их на определенное количество минут после достижения определенного порога.

Используя только 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. Сохранение значения тайм-аута в куки будет для пользователя абсолютно тривиальным, чтобы изменить / удалить куки
  2. Хранить его в переменной сеанса немного надежнее, но опять же - пользователь может просто удалить файл cookie сеанса, запустить новый сеанс и снова начать чтение.

При этом, вы бы сделали что-то вроде этого:

<?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

Я бы использовал функцию заголовка, чтобы перенаправить их на другую страницу, либо пустую, либо просто с меньшей интенсивностью использования банка (если, в любом случае, именно поэтому вы делаете это). Что-то вроде...

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

Вверху всех страниц нужно заблокировать.

Изменить: на самом деле, если подумать, (2), конечно, не нужно, если вошли 2 человека или 2 компьютера, они будут только потреблять их количество просмотров быстрее.

Вы можете сделать это при условии:

  1. Пользователь должен войти в систему, чтобы увидеть страницы.
  2. Вы не позволяете одному и тому же пользователю (имени) войти в систему дважды с разными сеансами.
  3. Вы сохраняете количество на пользователя, а не на сеанс или IP-адрес / что угодно.

(2) невозможно с файловыми сеансами по умолчанию. Требуется настраиваемая база данных или другое решение для постоянного хранения, в котором вы можете сканировать другие идентификаторы сеансов текущего идентификатора пользователя. В базе данных вы просто сохраняете поле идентификатора пользователя, также может быть создано собственное решение memcached и т. Д. Чтобы пользователи не могли быть заблокированы в сеансе, у них больше не было моего решения - всегда уничтожать любой старый сеанс, который был у пользователя. как только они войдут в систему. По сути, если попытаться выполнить это с несколькими сеансами / ips, им придется снова и снова входить в систему, делая предыдущий сеанс недействительным.

(3) снова некоторое постоянное хранилище с меткой времени + идентификатор пользователя + счетчик (в случае MySQL INSERT INTO tablename (user_id,time,count) VALUES (<id>,NOW(),1) ON DUPLICATE KEY UPDATE count=count+1 приходит на ум легко увеличивать счетчик просмотров.

И каждый запрос снова и снова запрашивает базу данных о том, сколько просмотров посетитель имел за последние X минут.

Другие вопросы по тегам