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

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

11 голосов
/ 29 января 2010

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

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

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

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

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

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

Ответы [ 6 ]

20 голосов
/ 29 января 2010

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

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

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

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

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

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

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

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


Относительно блокировки Brute Force: Очевидно, что решение на стороне сервера - единственный реальный способ сделать это. Для одного из моих текущих проектов я внедрил систему защиты от перебора, очень похожую на ту, которую вы описываете. Он был основан на этом Плагине защиты от грубой силы для 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 минут.

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

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

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

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

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

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

НТН

С

0 голосов
/ 29 января 2010

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

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

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

0 голосов
/ 29 января 2010

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

0 голосов
/ 29 января 2010

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

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

...