Борьба с плагином Time spent on blog жёсткими методами

Когда ничего другого не остаётся

Вчера пришлось очень рано встать из-за SMS от монитора, наблюдающего за сервером: Apache лёг от DDoS-атаки. Как оказалось, DDoS был спровоцирован плагином (http://iron.randombase.com/2008/05/31/wordpress-widget-time-spent-on-blog/, битая ссылка). Честно говоря, я никогда не понимал смысла в таких плагинах, тем более на очень посещаемых сайтах.

определяет, сколько времени пробыл пользователь на сайте (с двухсекундной точностью). Такая точность создаёт большие проблемы в тех случаях, когда средний посетитель открывает сразу три-пять страниц. Точность гарантируется конструкцией setTimeout("updateTime()", 2000), где updateTime() — функция, отправляющая асинхронный запрос на сервер.

Обновление текущей информации осуществляется в два запроса: SELECT для получения старых данных и INSERT/UPDATE для их обновления. Что характерно, в таблице нет никаких индексов, поэтому если у сайта обширная аудитория, а на сайте не настроена репликация, то MySQL очень быстро становится слабым звеном (что ни говори, а MyISAM не сильно хорошо работает с большим количеством параллельных записей). А IP-адрес посетителя (по нему делается выборка/обновление) хранится в базе строкой, что тоже далеко от идеала (экономнее хранить его числом).

Несколько сотен посетителей, открывшие по нескольку страниц, умудрились положить сервер.

Что характерно, удаление плагина не помогает, ибо запросы шлются JavaScript’ом из браузеров. А посетители уходить со страниц не торопились (наверное, видео смотрели; 6 человек до сих пор сидят). В результате, пока пользователь пьет чай/принимает душ и т.п., браузер делает чёрное дело и DoSит сервер.

Бороться приходится радикальными мерами: :-)

Если Apache пишет лог в формате vhost_combined ("%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" в Apache) в файл /var/log/apache2/other_vhosts_access.log, то бороться с пользователями можно так:

[-]
View Code Bash
tail -f /var/log/apache2/other_vhosts_access.log | \
egrep "synChro|getSum" | \
awk '{
    print "iptables -A INPUT -s "$2" -j REJECT";
    system("iptables -A INPUT -s "$2" -j REJECT");
}'

В другом окне запускается такой скрипт:

[-]
View Code Bash
watch -n 60 "iptables --flush"

Такой вот крон для бедных :-) В результате за несколько минут удалось снизить нагрузку во много раз.

Мораль сей истории: на очень посещаемые сайты плагины, собирающие статистику в реальном времени, ставить опасно.

Автор: ; опубликовано в: Linux; метки: iptables, Time Spent on Blog, WordPress, плагин
19
Май
2009

RSS Комментарии к статье «Борьба с плагином Time spent on blog жёсткими методами» (9)  »

  1. Прочитав название плагина, подумал, что он считает, сколько времени сам автор потратил на свой блог вместо того, чтобы работать. Думаю, такой плагин был бы гораздо полезнее :)

  2. >> очень рано встать из-за SMS от монитора, наблюдающего за сервером: Apache лёг от DDoS-атаки.
    Вот это у тебя сервис. Уважаю.
    ===
    У тебя снова капча? Что это так?

    • У тебя снова капча? Что это так?

      «Изящную» еще в октябре сломали, когда я в России был. А довести плагин до ума времени нет, поэтому поставил старую капчу.

  3. Ну и дела :) Очень забавная штука. Обычный пользователь в жизни бы не догадался. Я уже молчу о файрволе.

  4. Dofer

    Вся наша жизнь-борьба, и с плагинами так же :)

  5. MaryLee

    А какая посещаемость есть «большая»?

  6. AnAmile

    Ага, чтобы небыло проблем-ничего не ставить, так чтоль?

  7. [...] месяца назад я писал об одном очень жестком методе борьбы с последствиями установки…. Теперь этот же самый метод применяем на спам-ботах, [...]

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Борьба с плагином Time spent on blog жёсткими методами»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा