Для своих собственных проектов я написал обобщенную библиотеку 'floodcontrol', которая обрабатывает подобные вещи.
Позволяет указать, сколько попыток может быть сделано за X раз. Он допускает определенное количество попыток «благодати» за короткое время, так что будет поймано только действительно необычное поведение.
Я записываю в базу данных несколько вещей:
- IP-адрес (или его первые 24 бита)
- Действие, которое было предпринято (т. Е. «Войти в систему», «поиск», «комментарий»)
- Время покушения
- Количество попыток (счетчик попыток)
Для каждой сделанной попытки я запрашиваю частичный IP-адрес и действие, и если предыдущая попытка была сделана в течение определенного периода времени, то я увеличиваю счетчик попыток для этой попытки. Если счетчик попыток превышает количество разрешенных попыток отсрочки, я проверяю, была ли последняя попытка в течение X секунд, и если да, возвращает false - следовательно, действие будет заблокировано (и пользователю будет предложено подождать X секунд перед попыткой снова). Если счетчик попыток меньше числа попыток отсрочки, я возвращаю значение true и позволяю ему скользить.
Если человек с таким же IP-адресом приходит позже, то счетчик предыдущих попыток не будет получен, потому что он будет слишком давно.