На днях заметил возросшую нагрузку на сервер. Первыми мыслями было "установил какой-то плагин" и "нагрузка возросла из-за посещаемости", а значит нужно улучшить оптимизацию блога в плане производительности. Отключил наиболее прожорливые плагины, уменьшил количество файловых запросов, количество sql-запросов, вес главной страницы, страницы стали грузиться на полсекунды быстрее, но на следующие сутки, к моему удивлению, нагрузка на сервер наоборот увеличилась.
После анализа логов apache я увидел странную активность: с некоторых ip-адресов на протяжении длительного времени несколько раз в секунду посылался POST-запрос на URL вида "example.com/nazvanie-zapisi/edit", "example.com/zapis/edit", "example.com/esche-kakaya-to-zapis/edit". Кроме этого менее активно шли POST-запросы на URL "example.com/wp-login.php" - то есть подбирался пароль к админке блога. Бан этих ip адресов не помогал, через некоторое время появлялись другие ip-адреса с которых слались подобные URL.
Если с "/wp-login.php" все понятно - это подбор паролей, то зачем постоянно посылать данные на "/edit" и получать в ответ ошибку 404 - для меня было загадкой. На странице habrahabr.ru/qa/42608 я прочел о том, что эти запросы посылают браузеры с установленным зараженным плагином. Скорее всего создатель плагина что-то напортачил и бесполезные запросы на "/edit" результат глюка, . Как я понял, получается что какой-то посетитель зашел к Вам на сайт на какую-то страницу и пока вкладка в его браузере открыта вам посылаются такие запросы.
Логично просто запретить такие запросы в файле .htacces, что я и сделал.
Запрещаем POST-запросы к "/edit":
#Защита от /edit атаки RewriteCond %{REQUEST_METHOD} POST RewriteRule ^(.*/)?edit$ - [L,F]
Запрещаем "/wp-login.php":
#Защита от подбора пароля <Files wp-login.php> Order Deny,Allow Deny from all allow from 33.43.36.73 allow from 21.27.15.9 </Files>
Запретить только POST запросы к wp-login:
#Запрет POST запросов к wp-login кроме IP 33.33.33.222 RewriteCond %{REQUEST_METHOD} POST RewriteCond %{REMOTE_ADDR} !^33\.33\.33\.222$ RewriteCond %{REQUEST_URI} ^/wp-login\.php$ RewriteRule .? - [F]
В строках allow from указаны ip-адреса, с которых можно заходить на страничку "/wp-login.php", если у Вас динамический IP-адрес, то можно узнать какая сеть выделена вашему провайдеру и прописать разрешение для всей сети. wp-login.php, кстати говоря, можно защищать и другими методами, например переименовать его, но я выбрал этот.
Получается даже если у вас пароль сложный и его можно подбирать годами, то все равно лучше закрыть доступ к wp-login.php - это уберет лишнюю нагрузку на сервер. Кстати именно потому я до сих пор не защищал "/wp-login.php" - мои пароли генерируются случайно и нигде не используются дважды.
Хороший запрет. У меня такой давно стоит (для сетки, поскольку айпи динамический). А для тех, на кого запрет не подействует, у меня теперь двойная авторизация. :) И ещё блокировщик неправильных запросов — для надёжности. Чем бы ещё надёжность дополнить — для комплекта?..
Хм.. Да и так отлично защищены. На хостинге можно включить двойную авторизацию, через sms-прикрутить и регулярно делать бекапы. Перед каждым изменением wordpress — резервное копирование файлов и базы данных. После редактирования или публикаций какой-либо записи — резервное копирование базы данных.
Оптимизировать быстродействие, чтоб быть уверенной, что блог «ляжет» если однажды кто-то опубликует ссылку на Ваш блог где-то на посещаемом ресурсе.
Да, вот быстродействие не помешало бы. У меня для этого только ГиперКэш стоит, и пока не было возможности убедиться в его действенности: самой-то мне кэш обычно мешает, т.к. я по собственному сайту чаще хожу с тестами обновлений.
Гиперкеш говорят хороший плагин. Я использовал Суперкеш, но потом его отключил после того, как он закешировал мобильную версию сайта и начал ее отображать всем подряд.
Гиперкеш планирую в последнюю очередь применять =)