PHP: Anti-Flood/Spam система

Я на самом деле работаю над проектом PHP, который будет включать пользовательскую систему (Войти, Зарегистрироваться, Отправить потерянный пароль на электронную почту,..), и я думаю, что это может быть очень уязвимым для атак Brute-Force и / или Спама (Отправить пароль к чьей-то электронной почте, например, 1000 раз и т. д. Используйте свою фантазию) .

  • Есть ли у сегодняшних веб-серверов (Apache, IIS) какая-то встроенная защита от грубой силы?
  • Каков наилучший способ внедрения системы Анти-Спам /Flood, если я, например: хочу, чтобы страница не могла вызываться более двух раз в минуту, однако другая страница может вызываться до 100 раз в минуту или около того?,

    • Я определенно должен был бы хранить IP-адреса, время, когда они в последний раз посещали страницу, и количество посещений где-то - но было бы достаточно эффективно хранить его в текстовом файле / базе данных (MySQL)

    • Должен ли я использовать капчи для таких вещей, как регистрация / восстановление утерянных паролей?

    • Являются ли "текстовые" капчи жизнеспособными? (Что-то вроде "Что такое 5 плюс 9 минус 2? ")

    • Страница не будет использоваться таким количеством пользователей (100-200), нужно ли мне на самом деле реализовывать все эти вещи?

6 ответов

Решение

Что касается CAPTCHA: я бы рекомендовал не использовать CAPTCHA, если вам это действительно не нужно. Зачем?

  1. это ужасно.
  2. это раздражает ваших пользователей. Вы не должны заставлять их прыгать через обручи, чтобы использовать ваш сайт.

Есть несколько альтернатив, которые очень просты, могут быть очень эффективными и полностью прозрачными для (почти всех) пользователей.

  1. Поля Honeypot: добавьте поле к формам с общим названием, например, "веб-сайт". Рядом с ним добавьте ярлык с надписью "Не пишите в этой коробке". Используя Javascript скрыть ввод и метку. Когда вы получаете отправку формы, если в поле что-то есть, отклоните ввод.

    Пользователи с JS не увидят его и будут в порядке. Пользователи без JS просто должны будут следовать простой инструкции. Спам-боты влюбятся в него и раскроют себя.

  2. Автоматический faux-CAPTCHA: это похоже на выше. Добавьте поле ввода с надписью "Напишите" Алекс "" (например). Используя Javascript (и зная, что большинство автоматических спам-ботов не будут работать с JS), спрячьте поле и заполните его 'Alex'. Если в отправленной форме нет волшебного слова, игнорируйте ее.

    Пользователи с JS не увидят его и будут в порядке. Пользователи без JS просто должны будут следовать простой инструкции. Спам-боты не будут знать, что делать, и вы можете игнорировать их ввод.

Это защитит вас от 99,9% автоматических спам-ботов. То, чего он не сделает, даже в малейшей степени, защитит вас от целенаправленной атаки. Кто-то может настроить своего бота, чтобы избежать приманки или всегда вводить правильное значение.


Относительно блокировки Brute Force: решение на стороне сервера является единственным реальным способом сделать это, очевидно. Для одного из моих текущих проектов я внедрил систему защиты от перебора, очень похожую на ту, которую вы описываете. Он был основан на этом плагине Brute Force Protection для CakePHP.

Алгоритм довольно прост, но поначалу немного сбивает с толку.

  1. Пользователь запрашивает какое-то действие (например, сброс пароля)
  2. Бежать: DELETE * FROM brute_force WHERE expires < NOW()
  3. Бежать:

    SELECT COUNT(*) FROM brute_force 
    WHERE action = 'passwordReset'
    AND ip = <their ip address>
    
  4. Если количество больше, чем X затем скажите им подождать некоторое время.
  5. В противном случае запустите:

    INSERT INTO brute_force (ip, action, expires)
    VALUES (<their ip address>, 'passwordReset', NOW() + Y minutes)
    
  6. Продолжите с функцией сброса пароля.

Это позволит пользователям только попытаться сбросить пароль X раз за Y минут. Настройте эти значения по своему усмотрению. Возможно 3 сброса за 5 минут? Кроме того, у вас могут быть разные значения для каждого действия: для некоторых вещей (например, для создания PDF) вы можете захотеть ограничить его до 10 за 10 минут.

  1. Да, хранение IP-адреса, последнего доступа и времени доступа в базе данных было бы хорошо.
  2. Рекомендуется использовать CAPTCHA для регистрации / восстановления пароля, чтобы адреса электронной почты не могли быть спамированы. Также, чтобы остановить грубое принуждение.
  3. Да, текстовые CAPTCHA возможны, хотя для кого-то гораздо проще взломать и написать скрипт для автоматизации ответа. Для бесплатной капчи я бы порекомендовал Recaptcha.
  4. Это действительно зависит от того, насколько вы заботитесь о безопасности. Я бы определенно рекомендовал использовать CAPTCHA, поскольку они просты в реализации.

Не пытайтесь реализовать всю логику в вашем PHP - чем меньше в вашем стеке вы можете реализовать его, тем эффективнее с ним можно справиться.

Большинство брандмауэров (в том числе iptables в BSD/Linux) имеют регулировку соединения. Также обратите внимание на mod_security для предотвращения атак DDOS/brute force.

Вы должны разрабатывать свое приложение, основываясь на идее, что такого рода атаки не дадут злоумышленнику доступ к приложению - в конце концов, нет способа предотвратить атаку DOS, хотя вы можете ограничить ее эффективность.

Не стоит много полагаться на постоянный IP-адрес вашего злоумышленника - есть много способов обойти это.

например, отслеживать количество запросов на сброс пароля между логинами каждого пользователя. В форме сброса пароля ответьте (клиенту) точно так же, если пользователь отправляет неизвестный адрес электронной почты. Зарегистрируйте неверные адреса электронной почты.

НТН

C.

Помимо того, что делает Gazler, у вас также должен быть способ подсчета попыток входа в систему в целом. Если сумма всех попыток входа в систему больше, чем X, тогда либо начните использовать команду sleep, либо просто скажите, что серверы имеют высокую нагрузку.

Конечно, ваша целевая аудитория может быть небольшой, но если она находится в свободном доступе, она уязвима,

Поверьте мне, текстовые капчи легко взламываются

для системы Anti-Spam/Flood вы можете регистрировать IP-адреса (предпочтительно MySQL) и добавлять ограничение по времени повторных попыток входа в систему

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

Recaptcha действительно хорошее решение.

Другие вопросы по тегам