2016-09-27 1 views
1

У меня есть функция защиты от наводнений,PHP - антифлуд - как ограничить 2 запросов в секунду

if (!isset($_SESSION)) { 
    session_start(); 
} 

if($_SESSION['last_session_request'] > time() - 1){ 
die(); 
} 

$_SESSION['last_session_request'] = time(); 

Если пользователь запрашивает более 1 запроса в 1 секунду, скрипт останавливает себя. Я хочу сделать это, мне нужно разрешить максимум 2 запроса в секунду (вместо 1). Как я могу это сделать?

ответ

1

Я хотел бы сделать это следующим образом:

<? 
$time_interval = 1;#In seconds 
$max_requests = 2; 
$fast_request_check = ($_SESSION['last_session_request'] > time() - $time_interval); 

if (!isset($_SESSION)) 
{ 
    # This is fresh session, initialize session and its variables 
    session_start(); 
    $_SESSION['last_session_request'] = time(); 
    $_SESSION['request_cnt'] = 1; 
} 
elseif($fast_request_check && ($_SESSION['request_cnt'] < $max_requests)) 
{ 
    # This is fast, consecutive request, but meets max requests limit 
    $_SESSION['request_cnt']++; 
} 
elseif($fast_request_check) 
{ 
    # This is fast, consecutive request, and exceeds max requests limit - kill it 
    die(); 
} 
else 
{ 
    # This request is not fast, so reset session variables 
    $_SESSION['last_session_request'] = time(); 
    $_SESSION['request_cnt'] = 1; 
} 

Одна вещь, хотя - это не защитит вас от атак DDoS, если вы пытаетесь сделать это король вещи. Сессия в PHP может быть легко удалена, и даже если нет, несколько сеансов могут быть созданы с одного клиента. Read this discussion, если вы хотите узнать больше о защите.

+0

Отличный подход, спасибо. –

+1

Не проблема, добавлен дополнительный комментарий для вашей справки. –

+0

Обратите внимание, что люди, фактически привязанные к DoS, не будут сохранять/повторно использовать сеансы, они, вероятно, создадут новый сеанс с каждым запросом – hanshenrik

Смежные вопросы