УСТАНОВКА И ПРОДАЖА
КОНДИЦИОНЕРОВ В ОРЛЕ
Домашний мастер » Защита сайта от DDOS атак

Защита сайта от DDOS атак

Можно ли сделать защиту сайта от DDOS атак или спам-ботов простым способом? Не скажу, что вопрос очень актуальный, но некоторую часть вебмастеров интересует. Защита сайта в первую очередь важна доскам объявлений, интернет каталогам ссылок и статей, форумам. Хотя не лишним будет просто защитить любой домен хотя бы с целью уменьшения нагрузки на сервер. От мощных DDOS нагрузок простыми вариантами защититься сложно, но есть вариант такой защиты от всякой «мелочёвки» и надоедливых спам-ботов.


Какие варианты есть?

Правильная защита атакам будет считаться реально действующей, если атакующие спамеры будут в момент воздействия на ресурс, получать 403 ответ сервера - запрет доступа. При этом нагрузка на сервер будет ничтожной. С сильными DDOS атаками тут, конечно, посложнее будет, но эти DDOS атаки обычные сайты практически не достают по сравнению с проблемами связанными с защитой мощных сайтов.


Второй вариант защиты от примитивных DDOS атак или назойливых спам-ботов заключается в серверном редиректе атакующего. В момент начала действия на ресурс, атакуемый средствами PHP перенаправляется сервером на сторонний ресурс. Ниже по тексту будут разные варианты способов защиты от спам-атак.


Зачем, вообще, защищаться от атак?

Чем вообще опасны спамерские атаки на сайт с разных точек зрения? В принципе опасны только мощные DDOS атаки, резко и надолго выводящие домены из строя, а простые спам-боты массово заходящие в гости, конечно, не имеют такой разрушительной силы. Но это, как посмотреть. Защищаться от атак ботов однозначно можно и нужно, и вот почему.


На моих доменах, они располагаются на одном известном хостинге, периодически зависал КРОН, а важных заданий было много. Я долго переписывался с техподдержкой, почему вообще у меня часто блокируется КРОН, но они долго сами не могли дать точного и конкретного ответа. Писать им нужно было не только поэтому, но для того, чтобы техподдержка разблокировала мне зависший КРОН. Позже причина зависаний КРОНА была найдена, вопрос о защите стал актуальным.


Техподдержка подсказала мне простой и давно известный метод защиты сайта от атак - регулярно смотреть в логи посетителей сайта, выискивая особо назойливые IP-адреса, вписывая их потом в корневой файл htaccess. Это хорошая защита от спам-ботов и не крупных DDOS атак, только имеется одно НО. Такая защита сайта не является оперативной в моменты атак. А требуется, чтобы всё работало само автоматически без ручного вмешательства.


После долгих поисков нужных мне рабочих вариантов с проверкой их в деле, я выбрал несколько разных. Каждый для своей цели работает отменно. Теперь защита сайта от не сильных DDOS атак стала реальной. Варианты для эффективности можно совмещать, описание по тексту читайте далее.


Защита серверным редиректом

Такой простенький способ позволяет защититься от назойливых ботов, которые постоянно долбятся по разным директориям сайта, вызывая нагрузку на сервер. Принцип защиты простой: как только бот начнёт прыгать по страницам с большой скоростью, зависит от настроек, то автоматически будет уведён с сайта. Человек с такой скоростью по страницам не ходит, поэтому бот сразу редиректом с сайта отправляется куда угодно, на сайт Майкрософт, например.

<?php
// Доверенные имена ботов
if (strstr($_SERVER['HTTP_USER_AGENT'], 'Yandex')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Google')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Aport')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'bingbot')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Yahoo')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'msnbot')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Mail.RU')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Rambler')) {$bbots="good";}
// Какой-нибудь доверенный IP-адрес
elseif (strstr($_SERVER['REMOTE_ADDR'], '94.202.264.34')) {$bbots="good";}
else {
// Объявляем работу с сессиями
session_start();

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

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

// Поиск в массиве минимального интервала значений времени двух ближайших посещений
$min_time = min($_SESSION["arr_time"]);

// Сравниваем разницу между полученным интервалом посещений и указанным числом
// Если разница меньше указанного числа, то делаем действие
// Настроено на 3 клика (посещений) в 1 секунду. Пример: 0.1=10 кликам, 0.2=5 кликов, 0.5=2 клика
if ($time - $min_time < 0.333) {
// Строчка редиректа на сторонний ресурс
header("Location: https://www.youtube.com");
}

// Обновляем в массиве индекс значения данных на новый
$min_index = array_search($min_time,$_SESSION["arr_time"]);

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


Этот скрипт либо вставляется в самое начало главного индексного файла ресурса, либо инклюдится строкой подключения. Объяснять долго способ подключения смысла нет, вебмастера сами прекрасно всё знают.


Защита 403-им ответом сервера

При данном варианте защиты это будет самый, что ни на есть настоящий 403-ий ответ сервера. Можно гарантированно защититься от всего, что описано выше, а также от слабо-среднего уровня непродолжительных DDOS. Если атаки будут длительные и мощные, тогда просто ляжет сам хостинг. Скрипт подключается точно также, как прежний.

<?php
// Доверенные имена ботов
if (strstr($_SERVER['HTTP_USER_AGENT'], 'Yandex')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Google')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Aport')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'bingbot')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Yahoo')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'msnbot')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Mail.RU')) {$bbots="good";}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Rambler')) {$bbots="good";}
// Какой-нибудь доверенный IP-адрес
elseif (strstr($_SERVER['REMOTE_ADDR'], '94.202.264.34')) {$bbots="good";}
else {

// Функция для 100% определения IP адреса спамера
function RealIpAddr()
{
if(isset($HTTP_SERVER_VARS)) {
if(isset($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])) {
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}elseif(isset($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])) {
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}else{
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
}else{
if(getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
$ip = getenv( 'HTTP_X_FORWARDED_FOR' );
}elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
$ip = getenv( 'HTTP_CLIENT_IP' );
}else {
$ip = getenv( 'REMOTE_ADDR' );
}
}
return $ip;
}
$ip = RealIpAddr(); // Получение IP адреса посетителя
$lines = array();
if (!in_array($ip, $lines)) // Проверка наличия IP в массиве
{
$lines[] = $ip;
}

// Объявляем работу с сессиями
session_start();

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

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

// Поиск в массиве минимального интервала значений времени двух ближайших посещений
$min_time = min($_SESSION["arr_time"]);

// Сравниваем разницу между полученным интервалом посещений и указанным числом
// Если разница меньше указанного числа, то делаем действие
// Настроено на 10 кликов (посещений) в 1 секунду. Пример: 0.1=10 кликам, 0.2=5 кликов, 0.5=2 клика
if ($time - $min_time < 0.1) {
// Присваиваем переменной $mytext значение собранное из фразы "Deny from"
// и IP спамера для проверки его наличия в файле .htaccess
$mytext = "Deny from $ip";

// Адресация до корневого файла .htaccess
$file_htaccess = ".htaccess";

// Проверка файла .htaccess на наличие в нём записи типа "Deny from x.x.x.x",
// что бы не допустить повторной записи IP спамера
if(strstr(file_get_contents($file_htaccess), $mytext) != true)
{
// Запись фразы "Deny from" и IP спамера в самый конец файла .htaccess
file_put_contents($file_htaccess, "\r\n".$mytext."\r\n", FILE_APPEND | LOCK_EX);
}
}

// Обновляем в массиве индекс значения данных на новый
$min_index = array_search($min_time,$_SESSION["arr_time"]);

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


Защита технических папок и файлов сайта

Ниже следующий вариант позволит уменьшить нагрузку на сервер, запретив доступ в папки, которые нигде в URL-адресациях не используются – технические директории, но в работе сайта обязательно участвующие. При этом скрипты домена без проблем будут всё также обращаться в эти директории, но при попытке войти в них спамеру, что равносильно, если человек в адресной строке использует адресацию, где имеется защищаемая папка, произойдёт серверный редирект куда-нибудь по указанному URL-адресу.


Как правило, технические файлы и другие места, в которые доступ извне запрещён защищены, если в папке в которой они лежат, имеется файл .htaccess с содержащимися в нём вот этими строчками:

Order Deny,Allow
Deny from all


Эти строки помогают избавить директорию от её посещения кем бы то ни было кроме сервера (хостинга), где находится сам сайт. Для него доступ свободен. Только данными строками далеко не все места сайта можно закрыть - если всё закрыть таким образом, то сайт может вообще перестать нормально работать. Но так или иначе всегда есть папки подверженные спам атакам, которые как раз можно закрыть от этих нежданчиков, при этом сайт работать будет без проблем.


Если в корневой файл .htaccess вписать такие строчки, то проблема будет решена:

RewriteCond %{HTTP_REFERER} !^https://ваш_домен/ [NC]
RewriteRule ^Имя_защищаемой_папки/(.*)$ https://адрес_переадресации [NC]


Только помните, что если в HTML коде страниц вашего сайта имеется строчка, которая будет подгружать в ваш браузер какую-либо полезную информацию, например, картинку или текст из защищаемой папки, тогда эта самая информация НЕ под грузится и отображаться в браузере НЕ будет. И обязательно не забудьте прописать в файле robots.txt сайта строчку:

Disallow: /Имя_защищаемой_папки