Как временно заблокировать пользователя
Я хочу блокировать посетителя от 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.
Существуют различные уровни знания того, кто является кем-то.
- ID в URL
- Печенье
- Айпи адрес
И их ВСЕ можно преодолеть на разных уровнях сложности...
- Слишком просто (просто подделать другой идентификатор и т. Д.)
- Cookies такие же, как # 1
- 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, впустите их, иначе заблокируйте их.
Надеюсь это немного поможет.
- Сохранение значения тайм-аута в куки будет для пользователя абсолютно тривиальным, чтобы изменить / удалить куки
- Хранить его в переменной сеанса немного надежнее, но опять же - пользователь может просто удалить файл 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 компьютера, они будут только потреблять их количество просмотров быстрее.
Вы можете сделать это при условии:
- Пользователь должен войти в систему, чтобы увидеть страницы.
Вы не позволяете одному и тому же пользователю (имени) войти в систему дважды с разными сеансами.- Вы сохраняете количество на пользователя, а не на сеанс или 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 минут.