Сейчас: 13:54:54   25-го апреля 2024 г.
UsefulScript.ruСкриптыЗащита сайтаЗащита от частых обращений
3
15

Защита сайта от частых обращений к страничкам

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


К нам обратился один из наших посетителей с просьбой сделать скрипт, который бы оперировал не целыми секундами, а учитывал бы еще и десятые доли и позволял делать указанное количество обращений к сайту за указанный промежуток времени.


Данное предложение нам показалось интересным, т.к. старый скрипт позволял работать только с целыми значениями секунд и замерял время только между двумя обращениями к страничкам сайта.


В этом и заключался его главный минус, т.к. если пользователь, например, случайно нажал дважды на кнопку F5, либо подряд открыл несколько страничек в новом окне, то скрипт выдавал сообщение "Нельзя обращаться к сайту чаще, чем 1 раз в две секунды!".


В предлагаемом нами скрипте данная проблема устранена и скрипт можно настроить более гибко, например, ограничить пользователя тремя посещениями сайта за три с половиной секунды!


Скрипт установить довольно просто. Для этого в самом начале всех страниц Вашего сайта, которые необходимо защитить от частых обращений, поместите следующий код:

PHP код:
<?php
// Объявляем работу с сессиями
session_start();

// Получаем текущее время с точностью до сотой доли секунды
$time=microtime(1);

// Проверяем, имеется ли сессия с массивом для данного пользователя
// Если нет, то добавляем в сессию пустой массив для хранения времени посещений
if (!isset($_SESSION["arr_time"])) $_SESSION["arr_time"] = array(000);

// Поиск в массиве минимального значения времени захода
$min_time min($_SESSION["arr_time"]);

// Сравниваем разницу во времени между посещениями и указанным числом
// Если разница меньше указанного числа, то прекращаем работу и выводим сообщение
if ($time-$min_time 3.5) die("Вы слишком часто обращаетесь к страничкам сайта!");

// Получаем индекс значения минимального времени посещения в массиве
$min_index array_search($min_time,$_SESSION["arr_time"]);

// Заменяем в массиве минимальное время на текущее
$_SESSION["arr_time"][$min_index] = $time;
?>

В данном коде необходимо обратить внимание на два момента!


Первый момент - array(0, 0, 0), который задает размер пустого массива для хранения времени обращений к сайту. В данном случае array(0, 0, 0) означает, что скрипт будет хранить время трех последних посещений сайта и, соответственно, будет считать разницу во времени только между ними. Если Вам необходимо, например, настроить скрипт на пять посещений в указанный промежуток времени, то замените array(0, 0, 0) на array(0, 0, 0, 0, 0).


Второй момент - $time-$min_time < 3.5. В данном участке кода мы указывает интервал времени, в течение которого пользователь может сделать указанное количество обращений к сайту. В нашем примере это три обращения за 3,5 секунды.


Т.к. мы используем сессии, то данный скрипт записывает время последних обращений к страницам сайта для каждого посетителя в отдельности. При последующих обращениях к страничкам, скрипт высчитывает разницу между первым посещением и текущим. Если количество посещений за данный интервал времени не превысило указанное, то страничка будут отображена. В противном случае посетителю будет выведено сообщение "Вы слишком часто обращаетесь к страничкам сайта!".


Для наглядного примера работы скрипта, обновите данную страничку несколько раз. Скрипт настроен на три обращения в течение четырех секунд.


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


Только не увлекайтесь тестированием данного скрипта на нашем сайте, т.к. Вы можете попасть под санкции другого скрипта и получить автоматический БАН по IP из-за слишком частых обращений к страничкам. Подробнее в теме - Временная блокировка доступа к сайту.

Дата создания: 17:36:36 16.08.2015 г.
Посещений: 11979 раз(а).

Комментарии посетителей (12 шт.):
Геннадий
1
# 2636
(15:58:33  17.08.2015 г.)

Да, и этот скрипт рабочий. Только в строке $time=$t[1]+$t[0]; мы получаем текущее время с точностью не до сотых, а до десятитысячных долей. Простое echo $time; это докажет.
Остальная часть комментария и ответ на него были перенесены на форум.
Ответить

Геннадий
1
# 2641
(13:01:06  18.08.2015 г.)

Хочу спросить вот что. Разве не проще заменить две эти строчки:
$t=explode(" ",microtime());
$time=$t[1]+$t[0];
одной этой: $time=microtime(1);
Работает абсолютно одинаково и, как мне кажется, моя строка выполняет туже функцию, что ваши две. Зачем тут нужна функция explode()?
Ответить

Administrator
1
# 2643
(20:39:07  18.08.2015 г.)

Спасибо за правильно сделанное замечание.
Скрипт исправил, т.к. Ваш вариант правильнее использовать (PHP версия должна быть 5.0.0 или выше).
Я же использовал вариант, сделанный для PHP версии 4, что уже думаю не актуально.
Ответить

Юрий
2
# 2737
(13:55:40  01.10.2015 г.)

А как же поисковые роботы? Они не повесятся от ошибок доступа?
Ответить

Administrator
0
# 2740
(14:38:34  01.10.2015 г.)

Для поисковиков нужно делать проверку и не применять к ним данный скрипт. Для Яндекса, например, можно добавить директиву Crawl-delay в .htaccess для того чтобы он очень часто не заходил. Либо настраивать скрипт, например, на 15 посещений за 3 сек. С такой частотой поисковики на небольшие сайты не заходят, а для больших сайтов нужен хороший хостинг где данная защита не требуется.
Ответить

Стас
0
# 3267
(13:16:03  12.06.2016 г.)

Я обновил страничку сайта 5 раз, но сообщения об ограничении обращений так и не появилось.
Ответить

Administrator
1
# 3268
(13:42:44  12.06.2016 г.)

"В нашем примере это три обращения за 3,5 секунды".
Для того чтобы появилось сообщение нужно сделать более трех обновлений странички менее чем за 3,5 секунды. Попробуйте установить скрипт себе на сайт и увеличить интервал времени для упрощения тестирования.
Ответить

kinlok
0
# 4381
(09:40:07  11.12.2018 г.)

А будут ещё обновления скрипта? Или улучшение?
Ответить

Слава
0
# 4821
(00:53:37  14.04.2021 г.)

Доброй ночи! Помогите пожалуйста с такой проблемой: создал файл php с указанным кодом в статье. Подключил данный файл к каждой странице на сайте. На удаленном сервере пишет, что сайт недоступен (т.е. срабатывает скрипт), а на локальном:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at W:\domains\pravobraz33\index.php:1) in W:\domains\pravobraz33\sessiya.php on line 3
Ответить

Administrator
0
# 4822
(20:16:46  14.04.2021 г.)

Здравствуйте.
Проверьте, чтобы в файле sessiya.php перед <?php session_start(); не было никаких символов и пустых строк.
Ответить

Слава
0
# 4824
(11:47:52  15.04.2021 г.)

Все проверил: все в порядке... но проблема не исчезла.
Данный файл sessiya.php я подключаю в body. Правильно ли это?
Ответить

Administrator
0
# 4825
(21:34:11  15.04.2021 г.)

Если подключаете в другом файле, то в том файле, из которого подключаете файл sessiya.php так же необходимо чтобы первыми строчками было <?php session_start();
Ответить

Закрыть
Ваше имя:
730 + 1 =
Добавить комментарий:
Ваше имя:
730 + 1 =

Перед публикацией все комментарии проходят обязательную модерацию!

Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Посетителей онлайн: 17

Какие темы необходимо добавлять на сайт?