Делаю рукописный вход на сайт с записью попыток входа и их проверкой. В базу данных, в спец таблицу пишется попытка с логином, ip, user agent и датой.
При входе проверяется, не было ли за последние 20 минут более 5-ти неудачных попыток входа с этим логином и IP или более 20-ти попыток с этого IP. Если один из лимитов превышен - кидается ошибка входа с просьбой подождать. Если лимит не превышен и вход успешен, выполняется сброс попыток входа для пары логин/IP.
Вопрос: подходят ли указанные цифры для сайта с потенциальной посещаемостью 2000 чел/сутки? И надо ли сбрасывать при удачном входе все попытки для текущего IP (я сбрасываю, как написал, для пары логин/IP)?
Зачем тут ip? Он принципиально может меняться или просто использоваться сторонний. У Вк есть привязка по гео-данным, по которым они смотрят ip. Считай, как пин-код от карты : было более 5 неудачных попыток - блок по логину с высылкой уведомления.
Посторонним В.: ну да :) ломать юзера можно брут-форсом, что в сегодняшних реалиях очень маловероятно(пароль в хэше, блок по логину), перехватом пакетов и извлечением кукис из них, малварь. Войти всегда можно, если ввести уникальные данные : код, полученный в сообщении, допустим. Почта уже не является достоверным источником проверки безопасности, как и секретное слово.
Посторонним В.: но если к примеру человек ошибается в логине, например, символом, выходит - он может бесконечно грузить твой сервак, а никого так и не забанит. Тут все же стоит подумать об IP, но это не панацея, может еще куку использовать, вешать ее на клиент при заходе на сайт, если куки нет, значит он каким-то диким образом пытается получить доступ и блочим его, предварительно записав IP в бд. Куку надо будет обязательно шифровать, чтобы не подмешали. Также, насколько мне известно, с этой задачей хорошо справляются сессии, так мы можем связать между собой попытки входа. А блочить пользователя по логину - не выход, выходит можно заблочить всех твоих юзеров, зная логины, небольшим брутом.
Можно и с IP в БД создаётся табличка
login | ip | datetime
При каждой попытке входа в табличку заносится новая запись. Перед попыткой входа делается выборка count where datetime между последними 5 минутами. По cron'у табличка очищается