Стоит обычная задача ограничения попыток ввода пароля для конкретного индивида (самописный движок на PHP/MySQL): не более трёх за полчаса.
Вопрос: где хранить счётчик попыток?
На форумах везде предлагают сессию, но ведь удалить сессионные куки и завести новую сессию для бота - проще простого, ведь так? Как же быть в таком случае? Идентифицировать IP? Но, опять же, тогда надо где-то хранить счётчик - где?
Ну да, по сперва вам надо идентифицировать клиента как-то. IP само собой + id сессии или user-agent. Полностью гарантировать однозначную идентификацию у вас никак не выйдет.
Дальше делаете таблицу вида id-соединения (можно и несколько столбцов завести для выборки), last_access_time, count. Сверяетесь с ней при аутентификации. Пишите заодно и cron-сервис для подчистки устаревших записей.
Посторонним В.: да, вполне резонно. Учтите только, что лучше тогда включить для этой таблицы InnoDB, чтобы блокировка транзакции на запись вам не лочила всю таблицу.
Александр Кубинцев: на данный момент в таблцу записывается дата / IP / юзер-агент / ведённое имя / введённый пароль . Как вариант я могу прежде всего отслеживать пары IP-введённое имя, т. к. ломают ведь обычно конкретного юзера. Ну а потом поставить и общий лимит для неправильных вводов для c одного IP.
Посторонним В.: этого даже предостаточно. Можно смело выкинуть поле с введенным паролем, это избыточно. А логин это само собой нужно. Можно конечно выкинуть инфу об IP и User-agent в простейшей реализации. Однако, у меня это имело неприятный побочный эффект, когда блокировалась административная учётная запись. Можно конечно завести ещё одну или переименовать, но это тоже ничего не гарантирует. Тут нет идеального решения.