Как избежать злоупотребления формой забытого пароля

Эта проблема:

Я уже создал HTML-форму, в которой сначала проверяю, находится ли электронная почта в форме username@host.com, а затем, если ее электронная почта находится в базе данных, отправляю им электронную почту со своим временным паролем, чтобы они могли войти с этим временным паролем и сбросить свой пароль.
Но я также не хочу исключать ботов, которые могут пытаться получить список всех существующих электронных писем на моем сайте, в зависимости от того, что они получают с сайта, например. «Ваш пароль был сброшен …» .

Я видел некоторые сайты, которые делают это: если вы пытаетесь восстановить свой пароль с неправильным адресом, то (я думаю) заблокировать их IP-адрес на определенное время, скажем, 1 час. Я хотел бы знать, есть ли способ решить эту проблему с помощью PHP или JavaScript.

Если есть какие-либо примеры, которые я могу получить для этой проблемы, было бы здорово.

0

Решение

Вам нужна таблица в вашей базе данных для хранения данных.

Когда кто-то заполняет форму, зарегистрируйте ее в таблице. Вам нужен их IP и время.

Когда они заполнят форму, выясните, сколько попыток они предприняли за последние x минут. Если они больше чем x попыток, заблокируйте форму.

Боты будут использовать прокси-серверы, поэтому они могут попробовать 1000 IP-адресов за 10000 попыток за считанные минуты.

Добавление хорошей капчи было бы ключевым. Те, где вы должны выбрать конкретную картинку, что-то, что бот действительно не может пройти.

Идя по этому пути, вы захотите настроить задачу cron для очистки старых журналов, чтобы у вас не было миллиона записей, замедляющих работу вашего сайта. Запустите его, скажем, в полночь, и очистите все старые журналы за последние 24 часа или в любое время, которое, по вашему мнению, лучше всего подходит для вашей установки.

Замечания:
Это базовая настройка. Вы можете хранить все необходимые данные в таблице. Вы могли бы включить их пользовательский агент … но в самый короткий срок вам понадобится IP-адрес и дата, когда они предприняли какое-либо действие. С этой информацией вы можете выполнить SQL-запрос, чтобы узнать, сколько раз за последние x минут они пытались.

Вы также можете использовать сеансы и / или cookie-файлы. Однако пользователь может просто удалить cookie-файлы и избавиться от сеанса, а боты также могут пройти через сеансы и cookie-файлы. На самом деле, лучшее решение — хранить IP и время в таблице и обрабатывать их так, как вам удобно.

Без того, что вы публикуете какой-то код, я действительно не могу оправдать его написание. Мы здесь, чтобы помочь, а не заниматься программированием для других людей.

1

Другие решения

Я бы порекомендовал добавить капчу на странице регистрации:

Увидеть — Google ReCaptcha

Широко используются капчи, и особенно недавно выпущенная Google Captcha убирает много «раздражения», поскольку для этого — в большинстве случаев — нужен только флажок пользователя.

1

Есть несколько вариантов для этой ситуации. Как уже говорили некоторые, вы можете добавить капчу, она не на 100% надежна, но это хорошее решение.

С точки зрения безопасности, я бы не стал отправлять временный пароль пользователю, а отправлял бы пользователю ссылку на страницу, где он мог бы изменить пароль самостоятельно. Вам нужно будет либо сгенерировать одноразовый ключ, который они могут ввести на сайте, прежде чем менять свой пароль, либо сгенерировать ссылку, чтобы он содержал однократный код доступа и ваше приложение могло его забрать.
Кроме того, независимо от того, используете ли вы однократный код доступа или отправляете пользователю временный код доступа, убедитесь, что время ожидания смены пароля истекло. Вы можете просто установить отметку времени для их записи в базе данных и проверить ее при попытке ввести свой код / ​​сменить пароль

0