Безопасность в WordPress: как защитить свой блог от хакеров (часть 2)

Дата публикации:Август 30, 2011

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

1. Прячем лишнюю информацию

Описание проблемы:

Если вы не можете войти в панель управления своего WordPress блога, на экран обычно выдается некоторая информация, описывающая детали произошедшего сбоя. Она бывает полезной, если вы забыли свой пароль, но вот от посторонних людей лучше хранить такую информацию подальше. Почему бы не воспрепятствовать выводу сообщений об ошибках при неверном входе?

Решение:

Чтобы скрыть сообщения об ошибках при неверном входе, достаточно открыть файл function.php и добавить к нему следующий код:

add_filter('login_errors',create_function('$a', "return null;"));

Описание работы кода:

С помощью представленного фрагмента мы добавили простой хук, перезаписывающий функцию login_errors(). Поскольку произвольная функция, которую мы создали, возвращает только null, отображаемое на экране сообщение будет пустой строкой.

2. Используем мощь SSL

Описание проблемы:

Если вы беспокоитесь за сохранность своих данных, вы можете защитить их с помощью SSL. SSL представляет собой протокол шифрования, который используется в различных сетях, таких как Интернет. Использование SSL связано лишь с одной проблемой: не все компании, предлагающие услуги хостинга, поддерживают данное шифрование. Именно поэтому включение SSL может не дать никаких результатов.

Решение:

Если вы уверены, что ваш сервер может обработать SSL, откройте файл wp-config.php (находящийся в корне установленной системы WordPress) и добавьте к нему следующий код:

define('FORCE_SSL_ADMIN', true);

Описание работы кода:

Здесь нет ничего сложного. WordPress использует набор констант для конфигурации программного обеспечения. В данном случае мы определили константу FORCE_SSL_ADMIN и присвоили ей значение true. Тем самым мы включили использование SSL в WordPress.

3. Устанавливаем защиту для файла wp-config с помощью .htaccess

Описание проблемы:

Про работу с .htaccess мы уже говорили в части первой, но будет не лишним это повторить. Файл wp-config содержит в себе всю информацию, требуемую для доступа к базе данных: имя пользователя, пароль, имя сервера и т.д. Защита wp-config является важным шагом. Как использовать Apache для этой цели?

Решение:

Файл .htaccess лежит в корне вашей системы WordPress. После создания бэкапа (необходимо всегда иметь под рукой резервную копию этого важного файла) откройте .htaccess и добавьте к нему следующий код:

<files wp-config.php>
order allow,deny
deny from all
</files>

Описание работы кода:

Файл .htaccess является одним из лучших инструментов, позволяющих предотвратить нежелательный доступ к файлам WordPress. Во фрагменте кода мы создали простое правило, которое предотвращает любой доступ к wp-admin.php.

4. Заносим в черный список нежелательных пользователей и роботов

Описание проблемы:

Следующая онлайн-истина находит свое отражение и в реальной жизни: тот, кто надоедает вам сегодня, будет надоедать вам и завтра. Вы замечали, сколько раз за день к вам в блог приходят роботы, чтобы оставить свои малозначащие, раздражающие комментарии? Решить эту проблему довольно просто: достаточно закрыть им доступ к блогу.

Решение:

Добавьте к файлу .htaccess следующий код (не забудьте изменить 123.456.789 на тот IP, который вы хотите запретить):

<Limit GET POST PUT>
     order allow,deny
     allow from all
     deny from 123.456.789
     </LIMIT>

Описание работы кода:

С помощью Apache можно легко запретить доступ к сайту для определенных пользователей и роботов. С помощью приведенного фрагмента кода мы заносим пользователя с IP 123.456.789 в черный список.

Для того чтобы запретить доступ сразу нескольким пользователям, достаточно продублировать часть кода:

<Limit GET POST PUT>
order allow,deny
allow from all
deny from 123.456.789
deny from 93.121.788
deny from 223.956.789
deny from 128.456.780
</LIMIT> 

5. Защищаем свой блог от скриптовых инъекций

Описание проблемы:

Защита динамических веб-сайтов особенно важна. Большинство разработчиков всегда защищают свои запросы GET и POST, однако иногда этого недостаточно. Мы должны защитить свой блог от скриптовых инъекций и любых попыток изменения PHP-переменных GLOBALS и _REQUEST.

Решение:

Следующий фрагмент кода позволяет заблокировать скриптовые инъекции и предотвратить любые попытки изменения переменных GLOBALS и _REQUEST. Добавьте код к своему файлу .htaccess:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]

Описание работы кода:

Используя возможности .htaccess, мы можем проверить запросы. Здесь мы проверяем, содержит ли запрос тег <SCRIPT> и совершает ли он попытку изменить переменные GLOBALS и _REQUEST. Если какое-либо из этих условий выполнено, запрос будет блокирован, а браузер клиента возвратит ошибку 403.

6. Боремся с хотлинкингом

Описание проблемы:

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

Решение:

Чтобы защитить свой сайт от хотлинкинга и воровства контента, просто добавьте следующий код в файл .htaccess:

RewriteEngine On
#Replace ?mysite\.com/ with your blog url
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Replace /images/nohotlink.jpg with your "don't hotlink" image url
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

Теперь ссылаться на ваши изображения способны только вы в пределах своего блога, или, если быть более точным, никто не станет ссылаться на ваши изображения, поскольку теперь этот процесс значительно усложняется и отнимает много времени. Другие веб-сайты автоматически выведут на экран изображение nohotlink.jpg. Заметьте, что вы можете определить и несуществующее изображение, таким образом, веб-сайты, которые ставят на вас хотлинк, выведут на экран пустое пространство.

Описание работы кода:

Первое, что мы сделали в коде, это проверили значение HTTP_REFERER, чтобы узнать, соответствует ли оно URL-адресу нашего блога. Если это условие не выполняется, и ссылка указана на файл с расширением JPG, GIF, PNG или BMP, вместо него будет выведено на экран изображение nohotlink.

7. Создаем плагин для защиты своего блога от злонамеренных URL-запросов

Описание проблемы:

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

Решение:

Вставьте следующий фрагмент кода в текстовый файл, и сохраните его под названием blockbadqueries.php. Как только вы сделаете это, загрузите файл в каталог wp-content/plugins и активируйте созданный плагин. Теперь ваш блог защищен от злонамеренных запросов.

<?php
/*
Plugin Name: Block Bad Queries
Plugin URI: http://perishablepress.com/press/2009/12/22/protect-wordpress-against-malicious-url-requests/
Description: Protect WordPress Against Malicious URL Requests
Author URI: http://perishablepress.com/
Author: Perishable Press
Version: 1.0
*/

global $user_ID; 

if($user_ID) {
  if(!current_user_can('level_10')) {
    if (strlen($_SERVER['REQUEST_URI']) > 255 ||
      strpos($_SERVER['REQUEST_URI'], "eval(") ||
      strpos($_SERVER['REQUEST_URI'], "CONCAT") ||
      strpos($_SERVER['REQUEST_URI'], "UNION+SELECT") ||
      strpos($_SERVER['REQUEST_URI'], "base64")) {
        @header("HTTP/1.1 414 Request-URI Too Long");
	@header("Status: 414 Request-URI Too Long");
	@header("Connection: Close");
	@exit;
    }
  }
}
?> 

Описание работы кода:

Запрос проверяется нами на чрезмерную длину строки (более чем 255 символов) и на присутствие функций eval или base64 в URI. Если любое из этих условий выполнено, плагин передает браузеру ошибку 414.

8. Удаляем отображение используемой версии WordPress

Описание проблемы:

Насколько вы знаете, WordPress автоматически выводит на экран версию, которую вы используете в своем блоге. Это является относительно безопасным действием, если вы используете самую последнюю версию системы. Однако если по некоторым причинам ваш блог не обновлялся, лучше всего убрать отображение версии, чтобы не навлечь на себя внимание хакеров.

Решение:

Добавьте следующую строку в файл functions.php вашей темы:

remove_action('wp_head', 'wp_generator'); 

Описание работы кода:

Мы удаляем хук, который подцепляет к wp_head функцию wp_generator, ответственную за вывод версии.

http://coding.smashingmagazine.com/2010/07/01/10-useful-wordpress-security-tweaks/

Поделиться

13 комментариев

  1. Важная тема, об этом нужно писать и говорить как можно больше.

  2. _smirnov says:

    По поводу SSL, прописал константу, спросил у хостера про возможность, он ответил "Возможность подключения есть, возможности использовать собственный сертификат — нет". Попросил включить, при переходе в админку стабильно стала 404 ошибка. Так что необходимо — просто наличие у хостера поддержки протокола шифрования или обязателен сертификат? В этом рунете нет четкого ответа, все дерут друг у друга одно и тоже.

  3. Architect Of Ruin says:

    Хост должен продавать SSL сертификат — он требуется для работы с SSL. Причем хороший хост еще и сам предложит вам установить этот сертификат. Также вам, скорее всего, придется приобрести выделенный IP адрес (обычно стоит недорого).

  4. _smirnov says:

    Как то странно получается, тариф у нас с "полным фаршем", зачем тогда туда было включать "галочку" про SSL, если один фиг, на этом тарифе этот протокол не будет работать полноценно без сертификата. Ради понтов? А сами сертификаты только на VPN.

    • _smirnov says:

      пардон, VPS :)

      • Architect Of Ruin says:

        SSL поддерживают, а сертификаты не позволяют использовать… Когнитивный диссонанс какой-то :) Видимо, они сами плохо разбираются в своих услугах, или у них редко заказывают SSL на выбранном вами тарифе.

  5. Хорошая статья, некоторое применил.

  6. загрузите файл в каталог wp-content/plugins и активируйте созданный плагин. А как его активировать?
    Спасибо

Оставить комментарий

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

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.