БлогNot. PHP: простейшая защита от DDOS-атаки?

PHP: простейшая защита от DDOS-атаки?

Хотя бы, не от полноценной распределённой атаки, а от настойчивой "бомбёжки" Ваших страниц с какого-либо IP-адреса.

Вообще-то, если отвечать коротко, защищаться нужно конфигурированием сервера, а не на стороне PHP. Скажем, для Nginx имеется модуль limit_req.

Но что-то несложное можно в код при необходимости включать, например здесь скрипт должен выбрасывать плохиша на ошибку 503, если тот пытается делать более 10 запросов в секунду. По истечении 2 секунд плохиш амнистируется. Для работы кода нужна подключённая сессия PHP, то есть, по сути, включённые Cookies в браузере.

<?php
session_start(); 

//...
//Забанить при $limitps и более запросах в секунду
$limitps = 10;
if (!isset($_SESSION['first_request'])) {
 $_SESSION['requests'] = 0;
 $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
$time_interval = $_SERVER['REQUEST_TIME'] - $_SESSION['first_request'];
if ($time_interval <= 1 and $_SESSION['requests'] >= $limitps) {
 //Здесь - записать IP в список забаненных, 
 //а сервер д.б. сконфигурирован получать и учитывать этот список
 $_SESSION['banip'] = 1;
}
else if ($time_interval > 2) { //Амнистировать, если прошло более 2 сек.
 $_SESSION['requests'] = 0;
 $_SESSION['banip'] = 0;
 $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}

if ($_SESSION['banip'] == 1) {
 header('HTTP/1.1 503 Service Unavailable');
 die;
}

//Код
print_r($_SESSION);
echo '<pre>';
for ($i=0; $i<100; $i++) echo $i.' '.$i*$i."\n";
echo '</pre>';
?>

Метка времени $_SERVER['REQUEST_TIME'] доступна, начиная с версии PHP 5.1.0

01.07.2018, 00:27 [4033 просмотра]


теги: php время сервер безопасность

К этой статье пока нет комментариев, Ваш будет первым