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 [4217 просмотров]