Флуд атаки Wordpress

У меня есть несколько веб-сайтов WP, и они получают огромное количество запросов (около 20 тысяч в минуту), например:

www.example.com/adasd-asdasd-asdas-da/
www.example.com/fds-fdsf-dsfds-fds-f/
...

Проблема в том, что это заставляет мою базу данных каждый раз проверять, существует ли запись "adasd-asdasd-asdas-da" или "fds-fdsf-dsfds-fds-f" или... в моей базе данных, и она потребляет много Ресурсы.

Я прочитал сотни ссылок в Google, и все они используют ограничение IP / скорости, что не является решением для меня; Я не могу его использовать. Я видел некоторые блоги, в которых, когда пользователь попадает на неправильную страницу, они перенаправляют пользователя в Google и таким образом избавляются от атаки. Но как проверить каждый запрос в базе данных, не выключая всю систему?

Решить эту проблему действительно сложно, потому что мои законные URL-адреса выглядят так:

www.example.com/how-to-buy-a-flow
www.example.com/make-your-dad-happy
...

У меня уже 19 тысяч сообщений, и каждый раз, когда пользователь отправляет запрос типа www.example.com/fdsfds-fdsfs-dfds, мне нужно проверить его в базе данных, чтобы узнать, существует ли он.

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


person Samul    schedule 28.02.2014    source источник
comment
Просто предложение, и я не буду, если это возможно: создайте своего рода кеш на своем сервере, который будет автоматически обновляться при новом сообщении. Не читайте больше из вашей базы данных, а только из кеша, чтобы увидеть, существует ли сообщение.   -  person GuyT    schedule 28.02.2014
comment
@GuyT это хорошая идея, но cloudflare кэширует мои сообщения только на 5 минут, поэтому, если пользователь запрашивает сообщение 4-летней давности, мне нужно проверить в базе данных, существует ли оно. Я не могу проверять только самые последние, потому что пользователи часто просматривают старые сообщения.   -  person Samul    schedule 28.02.2014
comment
И добавить их в текстовый файл? Не знаете, какой запрос ввода-вывода будет потреблять? Конечно, я имею в виду заголовки, поэтому вы получаете список с заголовками и проверяете, существует ли запрошенный пост (заголовок) в файле .txt.   -  person GuyT    schedule 28.02.2014
comment
вау, это гораздо лучшее решение! Вы имеете в виду: я сохраняю все заголовки в текстовом файле (я экспортирую около 19 тысяч заголовков), и каждый раз, когда заходит пользователь, я проверяю strpos(), присутствует ли заголовок в текстовом файле? Вы уверены, что это будет быстрее, чем при использовании только MySQL? Я думаю, что mysql оптимизирован для этого, как вы думаете, поможет ли его перевод на php?   -  person Samul    schedule 28.02.2014
comment
Вы переместили проблему с (надеюсь) сканирования индексированных таблиц на полное сканирование файлов. Используйте memcache и введите заголовок, чтобы он был O (1)   -  person Mike B    schedule 28.02.2014
comment
@MikeB извини, но я не понял, что ты сказал. Что такое О(1)? В любом случае, вы считаете, что это не очень хорошая идея - перенести его из базы данных в текстовый файл?   -  person Samul    schedule 28.02.2014
comment
Хе-хе, я уже упоминал: это всего лишь предложение, но если я увижу ответы, это, вероятно, не очень хорошо;)   -  person GuyT    schedule 28.02.2014
comment
@Samul В информатике большая нотация O используется для классификации алгоритмов по тому, как они реагируют (например, по времени обработки или требованиям к рабочему пространству) на изменения размера ввода - en.wikipedia.org/wiki/Big_O_notation   -  person Mike B    schedule 28.02.2014
comment
@GuyT спасибо за предложение, я обязательно попробую, но я считаю, что проверка файла размером 1 МБ каждый раз, когда заходит пользователь, еще больше перегрузит мой веб-сервер.   -  person Samul    schedule 28.02.2014
comment
@MikeB спасибо, я не знал, что такое Bid O! Это действительно интересно. Но считаете ли вы, что просмотр файла размером 1 МБ каждый раз, когда заходит пользователь, является хорошим подходом?   -  person Samul    schedule 28.02.2014
comment
Единственный реальный ответ на этот вопрос — Майк Б. Перейдите на memcache, так как он помещает все в оперативную память и будет искать быстрее. В любом случае, при 20k/min я думаю, что ваш веб-сервер выключится раньше, чем mysql.   -  person Emi    schedule 28.02.2014


Ответы (4)


Вы можете заблокировать IP-адреса злоумышленника с помощью iptables или htaccess.

person kazy    schedule 28.02.2014
comment
А если они подделают свой IP? В конце концов, атакующий побеждает, потому что вы блокируете каждый IP/диапазон. - person GuyT; 28.02.2014
comment
Они используют тысячи поддельных IP-адресов. Вот почему я сказал в вопросе, что это не очень хорошее решение. - person Samul; 28.02.2014
comment
Я понимаю. В этом случае, я думаю, стоит попробовать решение Джеральда Шнайдера с fail2ban. - person kazy; 28.02.2014
comment
@ Адам, проблема с fail2ban в том, что каждый IP-адрес запрашивает очень мало страниц, поэтому он вообще не будет работать. - person Samul; 28.02.2014

Взгляните на fail2ban. Вы можете настроить его так, чтобы он отслеживал ваш журнал apache на предмет возникающих ошибок 404 и автоматически блокировал каждый IP-адрес, превышающий X ошибок 404, за N секунд через iptables.

Это довольно легко настроить.

person Gerald Schneider    schedule 28.02.2014
comment
Спасибо за помощь, но IP-адреса являются поддельными. В среднем каждый IP запрашивает только 2 страницы в час. Таким образом, блокировка каждого IP-адреса, запрашивающего 2 недействительные страницы каждый час, не поможет. - person Samul; 28.02.2014

...или, как дополнение к предложенному выше, вы можете установить удобный плагин block-bad-queries

Конечно, изменение .htaccess и/или настройка iptables брандмауэра предназначено для опытных пользователей и если у вас есть полный доступ к среде вашего веб-сервера.

person Bud Damyanov    schedule 28.02.2014

Сайт моей компании на WordPress также стал жертвой нескольких DDoS-атак. Вот несколько стратегий, которые оказались для нас бесценными:

  • Использование fail2ban (мониторинг /var/log/auth.log на предмет брутфорса SSH)
  • Блокировка /wp-login.php и /wp-admin.php от неавторизованных IP-адресов с помощью .htaccess
  • Установка Wordfence (чрезвычайно полезно для защиты WordPress)
  • Установка Bad Behavior (для pingback-атак)
person Alex W    schedule 27.01.2015