Я действительно работаю над проектом PHP, который будет содержать пользовательскую систему (вход, регистрация, отправка потерянного пароля на электронную почту, ..), и я думаю, что это может быть очень уязвимым для атак Brute-Force и / или спама (Отправить пароль к чьей-то электронной почте, например, 1000 раз и т. д., используйте свою фантазию).
Какой был бы лучший способ реализовать систему Anti-Spam / Flood, если я например: хочу, чтобы страница не могла быть вызвана более двух раз в минуту, однако другая страница может быть вызвана до 100 раз в минуту ,
Я определенно должен был бы хранить IP-адреса, время, когда они в последний раз посещали страницу, и количество посещений где-то – но было бы достаточно эффективно хранить его в текстовом файле / базе данных (MySQL)
Должен ли я использовать captchas для таких вещей, как регистрация / восстановление потерянных паролей?
Является ли «текст» привлекательным? (Что-то вроде «Что такое 5 плюс 9 минус 2?»)
Эта страница не будет использоваться многими пользователями (100-200), действительно ли мне нужно реализовать все эти вещи?
Что касается CAPTCHA: я бы рекомендовал не использовать CAPTCHA, если вам это действительно не нужно. Зачем?
Есть несколько альтернатив, которые очень просты, могут быть очень эффективными и полностью прозрачны для (почти всех) пользователей.
Поля Honeypot : добавьте поле в свои формы с общим именем, например «веб-сайт». Рядом с ним добавьте ярлык, говорящий о том, что «не пишите в этом поле». Использование Javascript скрыть ввод и метку. Когда вы получаете представление формы, если в поле есть что-либо, отклоните ввод.
Пользователи с JS не увидят его и все будет в порядке. Пользователи без JS просто должны следовать простой инструкции. Спамботы будут падать за него и проявить себя.
Автоматический faux-CAPTCHA : Это похоже на вышесказанное. Добавьте поле ввода с меткой «Write« Alex » (например). Используя Javascript (и зная, что большинство автоматических спам-ботов не будут запускать JS), спрячьте поле и заполните его «Alex». Если представленная форма не имеет там волшебного слова, то игнорируйте ее.
Пользователи с JS не увидят его и все будет в порядке. Пользователи без JS просто должны следовать простой инструкции. Спамботы не будут знать, что делать, и вы можете игнорировать их вклад.
Это защитит вас от 99,9% автоматических спам-ботов. То, что он не сделает, даже в малейшей степени, защищает вас от целенаправленной атаки. Кто-то может настроить своего бота, чтобы избежать honeypot или всегда заполнять правильное значение.
Что касается блокировки Brute Force: решение на стороне сервера является единственным жизнеспособным способом сделать это, очевидно. Для одного из моих текущих проектов я реализовал систему защиты от грубой силы, очень похожую на то, что вы описываете. Он был основан на этом плагине Brute Force Protection для CakePHP.
Алгоритм довольно простой, но немного запутанный изначально.
DELETE * FROM brute_force WHERE expires < NOW()
Бег:
SELECT COUNT(*) FROM brute_force WHERE action = 'passwordReset' AND ip = <their ip address>
X
попросите их подождать некоторое время. В противном случае выполните:
INSERT INTO brute_force (ip, action, expires) VALUES (<their ip address>, 'passwordReset', NOW() + Y minutes)
Это позволит пользователям только попробовать сбросить пароль X раз в Y минут. Подчеркните эти значения, как вы считаете нужным. Возможно, 3 сбрасывается через 5 минут? Кроме того, у вас могут быть разные значения для каждого действия: для некоторых вещей (например: создание PDF-файла) вы можете ограничить его 10 за 10 минут.
Не пытайтесь реализовать всю логику вашего PHP – чем ниже в вашем стеке вы можете реализовать его, тем более эффективно его можно решать.
Большинство брандмауэров (включая iptables на BSD / Linux) имеют дросселирование соединения. Кроме того, посмотрите на mod_security для предотвращения DDOS / грубой силы.
Вы должны разработать свое приложение вокруг идеи, что эти атаки не дают злоумышленнику доступа к приложению – в конце дня вы не сможете предотвратить атаку DOS, хотя вы можете ограничить ее эффективность.
Не стоит много полагаться на согласованный IP-адрес от вашего злоумышленника – есть много способов обойти это.
например, отслеживать количество запросов на сброс пароля между входами каждого пользователя. В форме сброса пароля ответьте (клиенту) точно так же, если пользователь отправит неизвестный адрес электронной почты. Зарегистрируйте недействительные адреса электронной почты.
НТН
C.
Помимо того, что говорит вам Газрель, вы также должны иметь способ подсчета попыток входа в систему в целом. Это общее количество попыток входа больше, чем X, либо либо начать использовать команду sleep, либо просто сказать, что серверы имеют большую нагрузку.
Хранение IP-адресов является хорошей практикой для loggin и отслеживания, но я думаю, что просто captcha будет прекращать спам-атаки, грубые атаки и наводнения.
Recaptcha – действительно хорошее решение.
конечно, ваша целевая аудитория может быть не большой, но если она находится в общественном достоянии, тогда она уязвима,
текст captcha's легко взломан в эти дни, поверьте мне
для системы Anti-Spam / Flood вы можете регистрировать IP-адреса (предпочтительно MySQL) и добавлять повторные попытки входа в лимит времени