PHP: Anti-Flood/Spam система
Я на самом деле работаю над проектом PHP, который будет включать пользовательскую систему (Войти, Зарегистрироваться, Отправить потерянный пароль на электронную почту,..), и я думаю, что это может быть очень уязвимым для атак Brute-Force и / или Спама (Отправить пароль к чьей-то электронной почте, например, 1000 раз и т. д. Используйте свою фантазию) .
- Есть ли у сегодняшних веб-серверов (Apache, IIS) какая-то встроенная защита от грубой силы?
Каков наилучший способ внедрения системы Анти-Спам /Flood, если я, например: хочу, чтобы страница не могла вызываться более двух раз в минуту, однако другая страница может вызываться до 100 раз в минуту или около того?,
Я определенно должен был бы хранить IP-адреса, время, когда они в последний раз посещали страницу, и количество посещений где-то - но было бы достаточно эффективно хранить его в текстовом файле / базе данных (MySQL)
Должен ли я использовать капчи для таких вещей, как регистрация / восстановление утерянных паролей?
Являются ли "текстовые" капчи жизнеспособными? (Что-то вроде "Что такое 5 плюс 9 минус 2? ")
Страница не будет использоваться таким количеством пользователей (100-200), нужно ли мне на самом деле реализовывать все эти вещи?
6 ответов
Что касается CAPTCHA: я бы рекомендовал не использовать CAPTCHA, если вам это действительно не нужно. Зачем?
- это ужасно.
- это раздражает ваших пользователей. Вы не должны заставлять их прыгать через обручи, чтобы использовать ваш сайт.
Есть несколько альтернатив, которые очень просты, могут быть очень эффективными и полностью прозрачными для (почти всех) пользователей.
Поля Honeypot: добавьте поле к формам с общим названием, например, "веб-сайт". Рядом с ним добавьте ярлык с надписью "Не пишите в этой коробке". Используя Javascript скрыть ввод и метку. Когда вы получаете отправку формы, если в поле что-то есть, отклоните ввод.
Пользователи с JS не увидят его и будут в порядке. Пользователи без JS просто должны будут следовать простой инструкции. Спам-боты влюбятся в него и раскроют себя.
Автоматический faux-CAPTCHA: это похоже на выше. Добавьте поле ввода с надписью "Напишите" Алекс "" (например). Используя Javascript (и зная, что большинство автоматических спам-ботов не будут работать с JS), спрячьте поле и заполните его 'Alex'. Если в отправленной форме нет волшебного слова, игнорируйте ее.
Пользователи с JS не увидят его и будут в порядке. Пользователи без JS просто должны будут следовать простой инструкции. Спам-боты не будут знать, что делать, и вы можете игнорировать их ввод.
Это защитит вас от 99,9% автоматических спам-ботов. То, чего он не сделает, даже в малейшей степени, защитит вас от целенаправленной атаки. Кто-то может настроить своего бота, чтобы избежать приманки или всегда вводить правильное значение.
Относительно блокировки 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 минут.
- Да, хранение IP-адреса, последнего доступа и времени доступа в базе данных было бы хорошо.
- Рекомендуется использовать CAPTCHA для регистрации / восстановления пароля, чтобы адреса электронной почты не могли быть спамированы. Также, чтобы остановить грубое принуждение.
- Да, текстовые CAPTCHA возможны, хотя для кого-то гораздо проще взломать и написать скрипт для автоматизации ответа. Для бесплатной капчи я бы порекомендовал Recaptcha.
- Это действительно зависит от того, насколько вы заботитесь о безопасности. Я бы определенно рекомендовал использовать CAPTCHA, поскольку они просты в реализации.
Не пытайтесь реализовать всю логику в вашем PHP - чем меньше в вашем стеке вы можете реализовать его, тем эффективнее с ним можно справиться.
Большинство брандмауэров (в том числе iptables в BSD/Linux) имеют регулировку соединения. Также обратите внимание на mod_security для предотвращения атак DDOS/brute force.
Вы должны разрабатывать свое приложение, основываясь на идее, что такого рода атаки не дадут злоумышленнику доступ к приложению - в конце концов, нет способа предотвратить атаку DOS, хотя вы можете ограничить ее эффективность.
Не стоит много полагаться на постоянный IP-адрес вашего злоумышленника - есть много способов обойти это.
например, отслеживать количество запросов на сброс пароля между логинами каждого пользователя. В форме сброса пароля ответьте (клиенту) точно так же, если пользователь отправляет неизвестный адрес электронной почты. Зарегистрируйте неверные адреса электронной почты.
НТН
C.
Помимо того, что делает Gazler, у вас также должен быть способ подсчета попыток входа в систему в целом. Если сумма всех попыток входа в систему больше, чем X, тогда либо начните использовать команду sleep, либо просто скажите, что серверы имеют высокую нагрузку.
Конечно, ваша целевая аудитория может быть небольшой, но если она находится в свободном доступе, она уязвима,
Поверьте мне, текстовые капчи легко взламываются
для системы Anti-Spam/Flood вы можете регистрировать IP-адреса (предпочтительно MySQL) и добавлять ограничение по времени повторных попыток входа в систему
Хранение IP-адресов является хорошей практикой для входа в систему и отслеживания, но я думаю, что только капча остановит спам, атаки с использованием грубой силы и наводнения.
Recaptcha действительно хорошее решение.