Безопасность WordPress как процесс

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

Является ли WordPress небезопасным?

WordPress принадлежит наибольшая доля рынка — 30% самых популярных сайтов используют этот движок. Такой успех делает его еще более привлекательной мишенью для хакеров.

Уязвимости в ядре WordPress стали причиной менее 10% всех взломов. Большинство из них связаны с устаревшими версиями платформы. Количество взломов, осуществленных через бреши в новейших версиях CMS, составляет малый процент от общего количества.

Остальные сайты были взломаны через уязвимости, связанные с плагинами, темами, хостингом и пользователями.

Кто вас атакует и почему?

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

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

Отправка спама

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

Атаки других сайтов

Распределенные атаки типа «отказ в обслуживании» используют множество компьютеров для перенаправления на сервер такого объема трафика, что он не может справиться с ним. Эти атаки очень трудно отразить. Хакеры, которые проникнут на ваш сервер, могут добавить его в пул серверов, используемых для таких атак.

Кража ресурсов

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

Улучшение SEO

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

Кража данных

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

Почему безопасность так важна?

Чтобы запустить взломанный WordPress-сайт, нужно удалить и заменить каждый бит стороннего кода (включая ядро ​​WordPress), проверить каждую строку своего кода. Заменить все пароли WordPress, пароли на сервере и пароли базы данных.

После взлома сайт теряет позиции в выдаче поисковых систем, что приведет к уменьшению количества посетителей и конверсий.

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

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

Давайте узнаем, как можно предотвратить все эти неприятности.

Триада CIA

Триада CIA является основой для каждого проекта цифровой безопасности. Это означает конфиденциальность, целостность и доступность. CIA- это набор правил, который ограничивает доступ сторонних пользователей к информации, обеспечивает достоверность и точность информации. А также гарантирует надежный доступ к этой информации.

Для WordPress структура CIA сводится к следующему.

Конфиденциальность

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

Целостность

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

При принятии запросов как к front-end, так и к back-end всегда проверяйте, соответствует ли намерение фактическому действию. При отправке данных проверяйте их на наличие вредоносного контента. Для удаления спама используйте специализированные плагины. Например, такие как Akismet.

Доступность

Убедитесь, что ядро WordPress,плагины и темы обновлены и размещены на надежном хостинге.
Все эти три элемента взаимосвязаны. Целостность исходного кода не будет сохранена, если конфиденциальный пароль пользователя легко украсть или подобрать. Для надежной работы платформы важны все аспекты.

Часть 1: Целостность — не доверяйте ничему

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

Валидация и санация данных

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

//Переводим переменную в строку и проверяем ее.
update_post_meta($post->ID,  ‘some-meta’,sanitize_text_field((string)$_POST[‘some-meta’]));

//Убеждаемся в том, что переменная - это абсолютное целое число.
update_post_meta($post->ID, ‘some-int’,absint($_POST[‘int’]));

В приведенном выше примере мы добавили в запись WordPress две части данных, используя update_post_meta. Первая — это строка, поэтому мы передаем ее в PHP как string . Затем вырезаем ненужные символы и теги с помощью sanitize_text_field, одной из многих функций санации WordPress.
Мы также добавили к этой записи целое число и использовали absint, чтобы убедиться, что это неотрицательное целое число.

Применение основных функций WordPress, таких как update_post_meta, является более предпочтительной практикой, чем использование базы данных напрямую. Это связано с тем, что WordPress проверяет все, что необходимо сохранить в базе данных на так называемые SQL-инъекции. Атака с использованием SQL-инъекций запускает вредоносный SQL-код через формы, размещенные на сайте. Этот код управляет базой данных, выполняя, например, удаление всех строк, кражу данных пользователей или создание ложных учетных записей с правами администратора.

При работе с пользовательской таблицей или выполнении сложного запроса в WordPress, используйте во всех запросах класс WPDB и функцию prepare, чтобы предотвратить атаки с помощью SQL-инъекций:

$tableName=$wpdb->prefix. “my_table”;
$sql=$wpdb->prepare( “SELECT*FROM%s”,$tableName);
$results=$wpdb->get_results($sql);

$wpdb->prepare проверяет каждую переменную, чтобы убедиться в отсутствии опасности SQL-инъекций.

Экранирование

Экранирование данных перед сохранением важно. Но вы не можете быть на 100% уверены, что они по-прежнему безопасны. WordPress использует множество фильтров, чтобы плагины и темы могли изменять данные «на лету». Поэтому есть большая вероятность,что данные будут скопированы с помощью других плагинов. Экранирование данных перед их добавлением в тему или плагин — разумное решение.

Экранирование предназначено для предотвращения атак с использованием межсайтового скриптинга (XSS). XSS-атаки внедряют вредоносный код во front-end сайта.

WordPress включает в себя множество функций экранирования. Вот простой пример:

<a href=“<?php echo esc_url($url);?>”title=“<?php echo esc_attr($title);?>”><?phpechoesc_html($title);?></a>

Обеспечение безопасности запросов

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

WordPress проверяет намерения с помощью nonce. Nonce (или «число, используемое только один раз») не является точным описанием этого API WordPress. Это не просто числа, они больше похожи на токен подмены межсайтовых запросов (CSRF), который можно найти в любом современном фреймворке. Эти токены предотвращают возможность копирования запросов.

Nonce отправляется вместе с каждым уязвимым запросом, который выполняет пользователь. Они привязаны к URL-адресам и формам, и их всегда нужно проверять на принимающей стороне перед выполнением запроса. Вы можете добавить nonce к форме или URL-адресу. Вот пример, используемый в форме:

<form method= “post”>
<!-- Add a nonce field: -->
<?phpwp_nonce_field( ‘post_custom_form’ );?>

<!-- other fields: →
...
</form>

В этом случае мы используем вспомогательную функцию wp_nonce_field(). Она генерирует два скрытых поля, которые будут выглядеть следующим образом:

<input type="hidden" id="_wpnonce" name="_wpnonce" value="e558d2674e"/>

<input type="hidden" name="_wp_http_referer" value="/wp-admin/post.php?post=2&action=edit"/>

Первое поле проверяет намерение, используя сгенерированный код с помощью строки «post_custom_form», которую мы передали функции. Второе поле добавляет реферер для проверки того, был ли запрос выполнен из системы WordPress.

Прежде чем обрабатывать задачу на другом конце формы или URL-адреса, необходимо проверить значение nonce, а также его валидность с помощью wp_verify_nonce:

if(wp_verify_nonce($_REQUEST[‘_wpnonce’], ‘post_custom_form’ )==false){
wp_die( “Nonce isn’t valid” );
}

Здесь мы сверяем nonce с именем действия. Ели оно не соответствует, прекращаем обработку формы.

Сторонний код

Большинство взломов WordPress связано с плагинами, темами и устаревшими версиями WordPress. Меньшее количество кода означает меньше возможностей для взлома.

Если уверены, что вам нужен какой-то плагин или тема, тогда внимательно изучите его. Посмотрите рейтинги, дату последнего обновления и требуемую версию PHP. Также поищите упоминания об этом плагине или теме в авторитетных блогах, посвященных безопасности, таких как Sucuri или WordFence.
Другой вариант — просканируйте исходный код и убедитесь в том, что он поддерживает корректные nonce, санацию и экранирование. Чаще всего это является признаком хорошо написанного и безопасного кода.

Для этого не нужно знать PHP. Простой и быстрый способ проверить правильность использования функций безопасности WordPress — это найти в исходном коде плагина следующие строки:

  • esc_attr;
  • esc_html;
  • wp_nonce_field;
  • wp_nonce_url;
  • sanitize_text_field;
  • $wpdb->prepare.

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

Вы можете проверить зависимости Composer с помощью инструмента для интерфейса командной строки (CLI) от SensioLabs. Такие сервисы, как Snyk, позволяют проверить каждую зависимость в проекте.

Часть 2: Доступность: Keep It Simple

Даже при наивысшем уровне безопасности вы все равно можете попасть в беду. Когда это произойдет, резервная копия сэкономит много времени и сил.

Обновление

Большинство атак на WordPress-сайты происходит через устаревшие версии CMS или плагинов.

Обновления безопасности для ядра WordPress теперь происходит. Автоматически. Но обновления для системы безопасности в плагинах — это совсем другая история.

Все плагины должны быть протестированы до того, как будут установлены на сайте. Такие инструменты, как WP CLI, упрощают обновление.

Пользователи, роли и права

«Доступность» в триаде CIA связана с передачей информации «в нужные руки». Главный приоритет заключается в ограничении прав конечных пользователей. Не создавайте для каждого администратора отдельную учетную запись.

Учетная запись администратора в WordPress предоставляет большие возможности. В теме Vanilla даже можно изменить полную базу кода через учетную запись администратора.

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

Электронная почта

WordPress обрабатывает электронную почту через сервер, на котором он установлен. Но это делает электронные письма полностью зависимыми от сервера. Предотвратите перехватывание писем и их просмотр с помощью службы SMTP. Доступно большое количество плагинов, с помощью которых можно обеспечить отправку писем через безопасное SMTP-соединение.

Для этого потребуется доступ к настройкам DNS доменного имени, чтобы добавить запись Framework Policy (SPF). Все качественные SMTP-сервисы предоставляют точную запись, которую необходимо добавить. Запись SPF гарантирует, что ваша SMTP-служба авторизована доменом для отправки электронной почты от своего имени.

Мониторинг

Мониторинг времени безотказной работы — это отличная практика. Такие инструменты, как Uptime Robot, усиливают безопасность.

Что касается целостности файлов, то важно понимать, что если хакеры получат доступ к серверу, они смогут изменить код. Существуют плагины, которые помогут справиться с подобной проблемой. У Sucuri есть отличный плагин для аудита. Он проверяет все файлы в соответствии с обширной базой известного вредоносного кода.

Кроме этого инструмент проверяет целостность ядра ​​WordPress. А также предоставляет подсказки в том случае, если есть нарушение.

Резервное копирование

Большинство качественных хостингов делают это за вас. Но есть и другие варианты, если ваш хостинг не осуществляет автоматическое резервное копирование: VaultPress, а также BackupBuddy с резервным копированием в Dropbox или Amazon S3.

Хостинг

WordPress — это не единственное программное обеспечение, работающее на сервере. Плохой хостинг является основной причиной, по которой WordPress поддерживает устаревшие версии PHP. На момент написания этой статьи32,5% всех WordPress-сайтов работают на версиях PHP, для которых больше не доступны обновления безопасности.


Почти 60% WordPress-сайтов работают на PHP 5.6 и 7.0, для которых исправления безопасности будут доступны только до конца этого года.

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

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

Часть 3: Конфиденциальность

Люди — это самая большая проблема в кибербезопасности.

Конфиденциальные данные

Используемые вами плагины и темы содержат ценные конфиденциальные данные. Например, если для WP_DEBUG установлено значение true, вы показываете каждому хакеру путь к корню сайта на сервере. На рабочей версии сайта не должно быть отладочных данных.

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

Кроме этого дважды проверьте, что вы поместили файл wp-config.php в .gitignore.

Не разрабатывайте код в одиночку

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

Если вы никого не попросите оценить качество созданного вам кода, то не будете знать, защищен ли он.

Логины и пароли

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

Доверяй, но проверяй

До сих пор мы вообще не говорили о социальной инженерии. Это форма взлома, которая набирает обороты. Обычно она не используется для взлома WordPress-сайтов. Но лучшая защита от социальной инженерии — «Доверяй, но проверяй».

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

Заключение

Ядро WordPress постоянно обновляется и исправляется. Но среда, окружающая WordPress, является небезопасной.

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

Перевод статьи «WordPress Security As A Process» был подготовлен дружной командой проекта Сайтостроение от А до Я