На сеансы нельзя положиться, если атака идет по сценарию, он даже не будет поддерживать сеансы.На IP нельзя полагаться, так как скрипт может постоянно менять свой исходный IP.
Я создал класс, который заботится о защите от перебора в PHP.
https://github.com/ejfrancis/BruteForceBlocker
в журнал заносятся все неудачные входы по всему сайту в таблицу БД, а также количество неудачных входов в систему за последние 10 минут (или любой другой период времени, который вы выберете) превышает установленный лимит, он устанавливает задержку по времени и / или требование капчи перед повторным входом в систему.
пример:
// построить массив настроек газа.(# недавние неудачные входы в систему => ответ).
$ throttle_settings = [
50 => 2, //delay in seconds
150 => 4, //delay in seconds
300 => 'captcha' //captcha
];
$ BFBresponse = BruteForceBlocker :: getLoginStatus ($ throttle_settings);
// $ throttle_settings - необязательный параметр.если он не включен, будет использован массив настроек по умолчанию в BruteForceBlocker.php.
switch ($ BFBresponse ['status']) {
case 'safe':
//safe to login
break;
case 'error':
//error occured. get message
$error_message = $BFBresponse['message'];
break;
case 'delay':
//time delay required before next login
$remaining_delay_in_seconds = $BFBresponse['message'];
break;
case 'captcha':
//captcha required
break;
}