Как временно заблокировать пользователя - PullRequest
0 голосов
/ 22 июля 2011

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

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

Мне нужна помощь, чтобы решить эту проблему ... Я пытаюсь создатьесли условие, но не повезло .. помогите мне, пожалуйста ...

 $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 ]

3 голосов
/ 22 июля 2011

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

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

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

  1. ID в URL
  2. печенье
  3. IP-адрес

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

  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 голос
/ 22 июля 2011

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

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

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

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

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

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

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

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

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

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

...