PHP: система Anti-Flood/Spam
Я действительно работаю над проектом PHP, который будет содержать пользовательскую систему (вход, регистрация, отправка потерянного пароля на электронную почту,..), и я думаю, что это может быть очень уязвимым для атак Brute-Force и/или спама (Отправляйте пароль кому-то по электронной почте, например, 1000 раз и т.д. Используйте свою фантазию)
.
- У современных веб-серверов (Apache, IIS) есть встроенная защита от Brute-Force?
-
Каким будет лучший способ реализации системы Anti-Spam/Flood, если я например: хочу, чтобы страница не могла быть вызвана более двух раз в минуту, однако другая страница может быть вызвана до 100 раз в минуту.
-
Мне бы определенно пришлось хранить IP-адреса, время, когда они в последний раз посещали страницу, и количество посещений где-то - но было бы достаточно эффективно хранить его в текстовом файле/базе данных (MySQL)
-
Должен ли я использовать captchas для таких вещей, как регистрация/восстановление потерянных паролей?
-
Являются ли "текст" "капчу" жизнеспособным? (Что-то вроде "Что такое 5 плюс 9 минус 2?" )
-
Страница не будет использоваться многими пользователями (100-200), действительно ли мне нужно реализовать все эти вещи?
Ответы
Ответ 1
Относительно CAPTCHA: Я бы рекомендовал не использовать CAPTCHA, если вам это действительно нужно. Почему?
- это некрасиво.
- Это раздражает ваших пользователей. Вы не должны заставлять их прыгать через обручи, чтобы использовать ваш сайт.
Есть несколько альтернатив, которые очень просты, могут быть очень эффективными и полностью прозрачны для пользователей (почти всех).
-
Поля Honeypot: добавьте поле в свои формы с общим именем, например "веб-сайт". Рядом с ним добавьте ярлык, говорящий о том, что "не пишите в этом поле". Использование Javascript скрыть ввод и метку. Когда вы получаете представление формы, если что-либо в поле, отклоните ввод.
Пользователи с JS не увидят его и будут в порядке. Пользователи без JS просто должны следовать простой инструкции. Спамботы будут падать за него и проявить себя.
-
Автоматический faux-CAPTCHA. Это похоже на вышесказанное. Добавьте поле ввода с надписью "Write 'Alex'" (например). Используя Javascript (и зная, что большинство автоматических спам-ботов не будут запускать JS), спрячьте поле и заполните его "Alex". Если представленная форма не имеет там магического слова, то игнорируйте ее.
Пользователи с JS не увидят его и будут в порядке. Пользователи без JS просто должны следовать простой инструкции. Спамботы не будут знать, что делать, и вы можете игнорировать их вклад.
Это защитит вас от 99,9% автоматических спам-ботов. То, что он не сделает, даже в малейшей степени, защищает вас от целенаправленной атаки. Кто-то может настроить своего бота, чтобы избежать honeypot или всегда заполнять правильное значение.
Что касается блокировки Brute Force: Решение на стороне сервера является единственным жизнеспособным способом сделать это, очевидно. Для одного из моих текущих проектов я реализовал систему защиты от грубой силы, очень похожую на то, что вы описываете. Он был основан на этом плагине принудительной защиты для CakePHP.
Алгоритм довольно простой, но немного запутанный изначально.
- Пользователь запрашивает некоторое действие (например, reset пароль)
- Запуск:
DELETE * FROM brute_force WHERE expires < NOW()
-
Run:
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)
- Продолжить с помощью функции пароля reset.
Это позволит пользователям только попробовать сбросить пароль X раз в Y минут. Подчеркните эти значения, как вы считаете нужным. Возможно, 3 сбрасывается через 5 минут? Кроме того, у вас могут быть разные значения для каждого действия: для некоторых вещей (например: создание PDF файла) вы можете ограничить его до 10 за 10 минут.
Ответ 2
- Да, сохранение IP-адреса, последнего доступа и времени доступа к базе данных будет прекрасным.
- Рекомендуется использовать CAPTCHA для регистрации/восстановления пароля, чтобы адреса электронной почты не могли быть отправлены спамом. Также, чтобы остановить грубое форсирование.
- Да, текст CAPTCHA возможен, хотя гораздо проще для кого-то взломать и написать script для автоматизации ответа. Для бесплатного CAPTCHA я бы рекомендовал Recaptcha.
- Это зависит от того, насколько вы заботитесь о безопасности. Я бы рекомендовал использовать CAPTCHA, поскольку они просты в реализации.
Ответ 3
Не пытайтесь реализовать all логику в вашем PHP - чем ниже в вашем стеке вы можете ее реализовать, тем эффективнее она может быть решена.
Большинство брандмауэров (включая iptables на BSD/Linux) имеют дросселирование соединения. Кроме того, посмотрите на mod_security для предотвращения DDOS/грубой силы.
Вы должны разрабатывать приложение вокруг идеи, что эти атаки не дают злоумышленнику доступа к приложению - в конце дня вы не сможете предотвратить атаку DOS, хотя вы можете ограничить его эффективность.
Там не так много смысла полагаться на согласованный IP-адрес от вашего злоумышленника - там много способов обойти это.
например. отслеживать количество паролей reset запросов между входами каждым пользователем. В форме пароля reset ответьте (клиенту) в точно таким же образом, если пользователь отправит неизвестный адрес электронной почты. Зарегистрируйте недействительные адреса электронной почты.
НТН
С.
Ответ 4
Помимо того, что расскажет вам Gazler, вы также должны иметь способ подсчета попыток входа в систему. Это общее количество попыток входа больше, чем X, либо либо начать использовать команду sleep, либо просто сказать, что серверы имеют большую нагрузку.
Ответ 5
Сохранение IP-адресов является хорошей практикой для loggin и отслеживания, но я думаю, что просто captcha будет прекращать спам-атаки, грубые атаки и наводнения.
Recaptcha - действительно хорошее решение.
Ответ 6
Конечно, ваша целевая аудитория может быть не большой, но если она в общественном достоянии, то она уязвима,
текст captcha легко взломан в эти дни, поверьте мне
для системы Anti-Spam/Flood вы можете регистрировать IP-адреса (предпочтительно MySQL) и добавлять повторные попытки входа в систему времени