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) и добавлять повторные попытки входа в систему времени