Безопасность WordPress как процесс
Опубликовано: 2022-03-10( Эта статья любезно спонсируется Sucuri .) Безопасность WordPress не имеет хорошей репутации. Согласно исследованию, проведенному Alexa на более чем 40 000 сайтов WordPress, более 70% всех сайтов WordPress имеют ту или иную уязвимость. Если вы разрабатываете темы или плагины WordPress — или используете WordPress для своих веб-сайтов — эта цифра должна вас напугать.
Вы можете многое сделать, чтобы убедиться, что вы не входите в 70%, но это требует больше усилий, чем просто установка плагина или экранирование строки. Многие советы в этой статье взяты из руководства Sucuri по безопасности WordPress и многолетнего личного опыта.
Является ли WordPress небезопасным?
WordPress имеет наибольшую долю рынка среди систем управления контентом и 30% долю рынка среди 10 миллионов самых популярных сайтов в Интернете. Такой успех делает его большой целью для хакеров. WordPress не менее безопасен, чем другие системы управления контентом — он просто более успешен.
Уязвимости в ядре WordPress являются причиной менее 10% всех взломов WordPress. Большинство из них связаны с устаревшими установками WordPress. Количество взломов, которые происходят из-за реальных дыр в безопасности в последних версиях (также известных как эксплойты нулевого дня) в ядре WordPress, составляет крошечный процент всех взломов.
Остальные зараженные сайты были вызваны плагинами, темами, хостингом и пользователями. И вы, как разработчик веб-сайта WordPress, контролируете все это. Если это кажется вам большой проблемой, я могу порекомендовать агентский план Sucuri. В противном случае давайте узнаем, как справиться с безопасностью WordPress самостоятельно!
Кто нападает на вас и почему?
Давайте сначала развеем миф: небольшой веб-сайт WordPress по-прежнему является привлекательной мишенью для хакеров. Нападки на личную почву очень редки. Большинство взломанных веб-сайтов WordPress автоматически скомпрометированы либо ботом, либо ботнетом.
Боты — это компьютерные программы, которые постоянно ищут сайты для взлома. Им все равно, кто вы; они просто ищут слабые места в вашей защите. Ботнет объединяет вычислительную мощность многих ботов для решения более крупных задач.
Хакеры в первую очередь ищут путь к вашему серверу, чтобы они могли использовать вычислительную мощность вашего сервера и использовать ее для какой-либо другой цели или цели. Хакерам нужен ваш сервер по следующим причинам.
Отправка спама
Спам составляет около 60% всей электронной почты, и его нужно откуда-то рассылать. Многие хакеры хотят получить доступ к вашему серверу через неисправный плагин или старую версию ядра WordPress, чтобы превратить ваш сервер в машину для рассылки спама.
Атака на другие сайты
Распределенные атаки типа «отказ в обслуживании» используют множество компьютеров, чтобы наполнить веб-сайт таким большим трафиком, что они не могут с ним справиться. Эти атаки очень трудно смягчить, особенно когда они сделаны правильно. Хакеры, взломавшие ваш сервер, могут добавить его в пул серверов для атаки на веб-сайты.
Кража ресурсов
Майнинг криптовалюты сейчас очень популярен, но требует больших вычислительных мощностей. Хакеры, которые не хотят тратить много денег на ферму серверов, взламывают незащищенные веб-сайты WordPress, получают доступ к серверам или посетителям ваших веб-сайтов и похищают вычислительную мощность.
Улучшение результатов SEO
Особенно популярный хак для WordPress — получить доступ к его базе данных и добавить кучу (скрытого) текста под каждым сообщением, ссылаясь на другой веб-сайт. Это действительно быстрый способ повысить свой рейтинг SEO, хотя Google становится более бдительным в отношении такого поведения, и количество черных списков увеличивается.
### Кража данных
Данные ценны, особенно когда они связаны с профилями пользователей и информацией об электронной торговле. Получение этих данных и их продажа могут принести злоумышленнику солидную прибыль.
Почему важна безопасность?
Помимо того, что преступники не получают удовлетворения, существует множество причин, по которым ваш веб-сайт должен быть безопасным по умолчанию. Почистив и разобравшись с большим количеством взломов WordPress, я могу с уверенностью сказать, что они никогда не происходят в удобное время. Уборка может занять несколько часов и будет стоить вам или вашему клиенту денег.
Чтобы снова запустить взломанный веб-сайт WordPress, вам необходимо удалить и заменить каждый бит стороннего кода (включая ядро WordPress); прочесать свой собственный код построчно и все остальные папки на сервере, чтобы убедиться, что они по-прежнему чисты; проверить, не получили ли доступ неавторизованные пользователи; и замените все пароли в WordPress, на вашем сервере и в вашей базе данных.
Множество сервисов могут очистить сайт WordPress за вас, но в долгосрочной перспективе профилактика намного лучше.
Помимо затрат на очистку, хаки также могут стоить вам больших упущенных продаж или лидов. Взломы опускают вас в поисковом рейтинге, что приводит к меньшему количеству посетителей и меньшему количеству конверсий.
Взлом вредит вашей репутации не только финансовыми затратами. Посетители приходят на ваш сайт, потому что доверяют вам. Взлом наносит ущерб вашей репутации, а на восстановление уходит много времени.
Существует также реальная вероятность юридических проблем, особенно если у вас есть клиенты в ЕС, где летом 2018 года вступит в силу законодательство GDPR. Это новое законодательство предусматривает крупный штраф за утечку данных, которая не обрабатывается должным образом.
Деньги, репутация и юридические проблемы: плохая безопасность может стоить вам дорого. Потратив некоторое время на то, чтобы ваш веб-сайт, код и команда были настроены с учетом безопасности, определенно окупятся.
Давайте узнаем, как мы можем предотвратить всю эту гадость.
Триада ЦРУ
Триада ЦРУ — это базовая структура для каждого проекта цифровой безопасности. Это означает конфиденциальность, целостность и доступность. CIA — это набор правил, ограничивающих доступ к информации нужным сторонам, гарантирующих достоверность и точность информации и гарантирующих надежный доступ к этой информации.
Для WordPress структура CIA сводится к следующему.
Конфиденциальность
Убедитесь, что вошедшим в систему пользователям назначены правильные роли и что их возможности контролируются. Предоставляйте пользователям только минимальный доступ, который им необходим, и следите за тем, чтобы информация администратора не просачивалась не к той стороне. Вы можете сделать это, укрепив панель администратора WordPress и проявляя осторожность с именами пользователей и учетными данными.
Честность
Покажите точную информацию на своем веб-сайте и убедитесь, что взаимодействие пользователей на вашем веб-сайте происходит правильно.
Принимая запросы как на передней, так и на задней стороне, всегда проверяйте, соответствует ли намерение фактическому действию. Когда данные публикуются, всегда фильтруйте данные в своем коде на наличие вредоносного содержимого с помощью очистки и экранирования. Убедитесь, что спам удален с помощью службы защиты от спама, такой как Akismet.
Доступность
Убедитесь, что ваш WordPress, плагины и темы обновлены и размещены на надежном (желательно управляемом) хостинге WordPress. Ежедневное автоматическое резервное копирование также помогает обеспечить доступность вашего веб-сайта для общественности.
Все три элемента опираются друг на друга для поддержки. Целостность кода не будет работать сама по себе, если конфиденциальный пароль пользователя будет легко украден или угадан. Все аспекты важны для надежной и безопасной платформы.
Безопасность — это очень тяжелая работа. Помимо работы, которую можно выполнить в коде, в этой структуре есть огромный человеческий фактор. Безопасность — это постоянный процесс; это не может быть решено одним плагином.
Часть 1: Честность — ничему не доверяйте
Проверяйте намерение действий пользователя и целостность данных, с которыми вы работаете. Выбросьте своего внутреннего хиппи за дверь. В сети нельзя доверять ничему, поэтому дважды проверяйте все, что вы делаете, на предмет возможного злого умысла.
Проверка данных и очистка
WordPress отлично справляется с данными. Он гарантирует, что каждое взаимодействие проверяется и что каждый бит данных очищается, но это только в ядре WordPress. Если вы создаете свой собственный плагин или тему или даже просто проверяете часть стороннего кода, важно знать, как это сделать.
//Cast our variable to a string, and sanitize it. update_post_meta( $post->ID, 'some-meta', sanitize_text_field( (string)$_POST['some-meta'] ) ); //Make sure our variable is an absolute integer. update_post_meta( $post->ID, 'some-int', absint( $_POST['int'] ) );
В этом примере мы добавили две части данных в сообщение WordPress, используя update_post_meta. Первый — это строка; поэтому мы преобразуем его в строку в PHP и удаляем ненужные символы и теги с помощью sanitize_text_field
, одной из многих функций очистки WordPress.
Мы также добавили целое число к этому сообщению и использовали absint, чтобы убедиться, что это абсолютное (и неотрицательное) целое число.
Использование основных функций WordPress, таких как update_post_meta
, лучше, чем непосредственное использование базы данных WordPress. Это связано с тем, что 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-атаки внедряют вредоносный код во внешний интерфейс вашего сайта. Дополнительным преимуществом экранирования данных является то, что вы можете быть уверены, что ваша разметка по-прежнему действительна после этого.
WordPress имеет много функций экранирования. Вот простой пример:
<a href=“<?php echo esc_url( $url );?>” title=“<?php echo esc_attr( $title );?>”><?php echo esc_html( $title );?></a>
Бегите как можно позже. Это гарантирует, что последнее слово будет за вами.
Защита запросов
Запросы администратора WordPress уже довольно безопасны, если у вас включен SSL и если у вас есть приличный хост, но некоторые уязвимости все еще существуют. Вам необходимо проверить намерение пользователя и подтвердить, что входящий запрос был выполнен фактическим вошедшим в систему пользователем.
WordPress проверяет намерение с помощью одноразовых номеров. Одноразовый номер (или «число, используемое только один раз») на самом деле не является точным описанием этого API в WordPress. Он использует не только числа, но и больше похож на токен подделки межсайтовых запросов (CSRF), который вы найдете в каждой современной веб-инфраструктуре. Эти токены гарантируют, что хакеры не смогут повторять запросы. Это намного больше, чем просто одноразовый номер, но WordPress любит обратную совместимость, поэтому название прижилось.
Nonce отправляются вместе с каждым уязвимым запросом, который делает пользователь. Они прикреплены к URL-адресам и формам, и их всегда необходимо проверять на принимающей стороне перед выполнением запроса. Вы можете добавить одноразовый номер в форму или URL-адрес. Вот пример использования в форме:
<form method= “post”> <!-- Add a nonce field: --> <?php wp_nonce_field( 'post_custom_form' );?> <!-- other fields: → ... </form>
В этом случае мы просто используем простую вспомогательную функцию wp_nonce_field()
, которая создает для нас два скрытых поля, которые будут выглядеть так:
<input type="hidden" 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-адреса вы должны проверить одноразовый номер и его действительность с помощью wp_verify_nonce
:
if( wp_verify_nonce( $_REQUEST['_wpnonce'], 'post_custom_form' ) == false ){ wp_die( “Nonce isn\'t valid” ); }
Здесь мы проверяем одноразовый номер с нашим именем действия, и если оно не совпадает, мы прекращаем обработку формы.
Сторонний код
Сторонние плагины и темы — рассадник для хакеров. Они также являются самым крепким орешком при обеспечении безопасности вашего сайта.
Большинство взломов WordPress вызваны плагинами, темами и устаревшими копиями WordPress . Ни одно программное обеспечение не является на 100% безопасным, но многие плагины и темы либо не обновлялись некоторое время их разработчиками, либо изначально не были безопасными.
Меньше кода — меньше взлома. Итак, прежде чем устанавливать очередной плагин, спросите себя, действительно ли он вам нужен. Есть ли другой способ решить эту проблему?
Если вы уверены, что вам нужен плагин или тема, оцените их тщательно. Посмотрите на рейтинг, дату «последнего обновления» и требуемую версию PHP при просмотре каталога плагинов WordPress. Если вы нашли то, что искали, и кажется, что все работает, поищите любые упоминания об этом в надежном блоге по безопасности, таком как Sucuri или WordFence.
Другой вариант — отсканировать код и убедиться, что он содержит правильные одноразовые номера, санацию и экранирование; обычно это признаки хорошо написанного и безопасного кода. Вам не нужно знать PHP или делать полный обзор кода. Простой и быстрый способ проверить правильность использования функций безопасности WordPress — найти в коде плагина следующие строки:
-
esc_attr
-
esc_html
-
wp_nonce_field
-
wp_nonce_url
-
sanitize_text_field
-
$wpdb->prepare
Плагин все еще может быть безопасным, если он не включает все эти строки, но если не найдено ни одной или небольшое количество этих строк, это красный флаг. Если вы обнаружили уязвимость, поделитесь ею с создателем в частном порядке и дайте ему время исправить ее.
Отслеживание уязвимостей в пространстве плагинов WordPress становится проще благодаря таким инициативам, как wpvulndb.
Примечание. Некоторые темы объединяют версии плагинов с их кодом. Это признак того, что WordPress не имеет отличного встроенного управления зависимостями, но это также признак очень плохо написанной темы. Всегда избегайте этих тем, потому что они включают базы кода, которые нельзя обновить.
Темы и плагины редко содержат код, написанный только одним разработчиком. Composer и NPM настолько упростили зависимость от других библиотек, что стали популярным вектором атак. Если вы загружаете готовую тему или плагин WordPress, это действительно не проблема, но если вы работаете с инструментами, использующими Composer или NPM, то проверить их зависимости не помешает. Вы можете проверить зависимости Composer с помощью бесплатного инструмента интерфейса командной строки (CLI) от SensioLabs. Такая служба, как Snyk (которую вы можете использовать бесплатно, но которая также имеет дополнительные опции), позволяет вам проверить каждую зависимость в вашем проекте.
Часть 2. Доступность: будьте проще
Ваша главная цель — поддерживать бесперебойную работу вашего веб-сайта. Даже при первоклассной безопасности вы все равно можете попасть в беду. Когда это произойдет, отличная резервная копия избавит вас от большой головной боли.
Обновления
Открытый исходный код не может существовать без обновлений. Большинство атак на сайты WordPress происходят из-за устаревших версий основного программного обеспечения или плагинов. Обновления безопасности для ядра WordPress теперь обрабатываются автоматически (если вы не отключили это, монстр!), но обновления безопасности в плагинах — это совсем другая история.
Обновление популярных, надежных плагинов обычно безопасно, но все плагины должны быть протестированы, прежде чем они появятся на вашем веб-сайте. Такие инструменты, как WP CLI, значительно упрощают обновление. У ведущего разработчика WordPress Марка Джакита была отличная запись в блоге об автоматическом, но постепенном обновлении всех плагинов, чтобы вы могли отфильтровать возможные ошибки.
Пользователи, роли и возможности
«Доступность» в триаде ЦРУ связана с получением информации в нужные руки. Нашим главным приоритетом в этом является ограничение возможностей ваших серверных пользователей. Не давайте всем учетную запись администратора.
Учетная запись администратора в WordPress необычайно мощная. В ванильном WordPress даже есть возможность изменить всю кодовую базу из учетной записи администратора WordPress. (Если это новое для вас и вы не отключили это, сделайте это.)
Система ролей и возможностей в WordPress мощная, и ее очень легко изменить в коде. Я создаю много новых ролей при работе с WordPress. Основное преимущество этого заключается в том, что вы получаете полный контроль над тем, к каким частям системы имеют доступ различные пользователи, но еще одним огромным преимуществом является то, что сторонний код не может изменить стандартные возможности ядра WordPress.
Эл. адрес
WordPress обычно обрабатывает электронную почту через сервер, на котором он находится, но это делает всю вашу электронную почту полностью зависимой от сервера, на котором она работает. Предотвратите перехват ваших электронных писем и их рассмотрение как спам с помощью службы SMTP. Доступно множество опций плагина, чтобы убедиться, что вся ваша почта отправляется через безопасное SMTP-соединение.
Однако вам потребуется доступ к настройкам DNS доменного имени, чтобы добавить запись Sender Policy Framework (SPF). Все хорошие службы SMTP предоставят именно ту запись, которую необходимо добавить. Запись SPF гарантирует, что ваша служба SMTP авторизована доменом для отправки электронной почты от своего имени.
Мониторинг
Мониторинг вашего веб-сайта в Интернете — это задача 24/7, которая может быть полностью автоматизирована. В случае с WordPress нас интересует время безотказной работы и целостность файлов.
Обычно хороший хост сделает за вас мониторинг времени безотказной работы . Такие инструменты, как Uptime Robot, обеспечивают еще большую безопасность. Ваши первые 50 веб-сайтов совершенно бесплатны.
Что касается целостности файлов , если хакер получит доступ к вашему серверу, он может изменить ваш код.
В этом случае плагины — это решение вашей проблемы. У Sucuri есть отличный плагин для аудита. Он проверяет все файлы в вашей установке по обширной базе данных известного вредоносного кода. Он также проверяет, является ли ядро WordPress по-прежнему 100% ядром WordPress, и сообщает вам, если произошла брешь, чтобы вы могли исправить ее как можно скорее.
Резервные копии
Абсолютная отказоустойчивость любого процесса безопасности — автоматическое резервное копирование. Большинство хороших хостов сделают это за вас, но есть и другие хорошие варианты, если ваш хост не предлагает резервное копирование. Automattic создает один из них с именем VaultPress, а такие инструменты, как BackupBuddy, выполняют резервное копирование в учетную запись Dropbox или корзину Amazon S3.
Большинство надежных сервисов в резервном пространстве WordPress — это либо сервисы премиум-класса, либо плагины премиум-класса. В зависимости от того, нужно ли вам полностью контролировать свои данные, вы можете предпочесть плагин, который поставляется с облачным хостом, а не службу. Однако любой из них стоит каждой копейки.
Хостинг
WordPress — не единственное программное обеспечение, работающее на вашем сервере. Когда вы находитесь на дрянном хостинге, открыто множество векторов атак. На самом деле плохой хостинг — основная причина, по которой WordPress до сих пор поддерживает устаревшие версии PHP. На момент написания статьи собственная страница статистики WordPress сообщает, что 32,5% всех установок WordPress работают на версиях PHP, которые больше не получают обновлений безопасности.
Обратите внимание на то, что почти 60% установок работают на PHP 5.6 и 7.0, которые получат исправления безопасности только до конца этого года.
Хостинг важен не только для поддержания программного обеспечения вашего сервера в актуальном состоянии. Хороший хост предложит гораздо больше услуг, таких как автоматическое ежедневное резервное копирование, автоматические обновления, мониторинг целостности файлов и безопасность электронной почты. Существует большая разница между управляемыми хостами WordPress и хостами, которые предоставляют вам онлайн-папку с доступом к базе данных.
Лучший совет — найти достойный управляемый хостинг WordPress. Они стоят немного дороже, но обеспечивают отличную основу для вашего сайта WordPress.
Часть 3: Конфиденциальность
Если вы убедились, что ваша кодовая база настолько безопасна, насколько это возможно, и вы находитесь на отличном хостинге WordPress, окруженном сканерами вредоносных программ и резервными копиями, у вас все равно будут проблемы с безопасностью, потому что люди хуже всего. … в интернет-безопасности.
Конфиденциальность заключается в обучении себя, своего клиента и пользователей веб-сайта.
Конфиденциальные данные
Возможно, вы этого не знаете, но ваши плагины и темы, вероятно, отображают ценные конфиденциальные данные. Если, например, для WP_DEBUG
установлено значение true
, то вы показываете каждому хакеру корневой путь вашего веб-сайта на сервере. Отладочным данным не должно быть места на вашем рабочем веб-сайте.
Еще одним ценным источником данных являются комментарии и авторские страницы. Они заполнены именами пользователей и даже адресами электронной почты. Хакер может использовать их в сочетании со слабым паролем, чтобы попасть на ваш сайт. Будьте осторожны с тем, что вы показываете внешнему миру.
Кроме того, дважды проверьте, что вы поместили wp-config.php
в свой .gitignore
.
Не кодируйте в одиночку
Способ предотвратить проникновение большого количества ошибок в вашу кодовую базу — практиковать парное программирование. Если вы один, это намного сложнее, но существует множество онлайн-сообществ, готовых провести быструю проверку кода. WordPress, например, использует Slack, чтобы сообщать все о разработке своей платформы. Там вы найдете много людей, готовых помочь. Более медленными, но лучшими альтернативами являются форумы WordPress, вопросы StackOverflow и GitHub, где ваши вопросы (и их ответы!) сохраняются, чтобы другие люди могли извлечь из них пользу.
Просить внести свой вклад может быть сложно, но люди любят демонстрировать свой опыт, а у WordPress в целом очень открытое и гостеприимное сообщество. Дело в том, что если вы никогда не спросите мнение о качестве вашего кода, то вы не будете знать, безопасен ли ваш код.
Логины и пароли
Вашим клиентам нужно будет войти в WordPress, чтобы управлять своим контентом. Ядро WordPress делает все возможное, чтобы предотвратить проникновение слабых паролей, но обычно этого недостаточно.
Я бы порекомендовал добавить на ваш сайт плагин для двухфакторной аутентификации, а также ограничить количество попыток входа в систему. Еще лучше — полностью отказаться от паролей и работать с магическими ссылками.
Доверяй, но проверяй
До сих пор в этой статье мы вообще не говорили о социальной инженерии. Это форма взлома, которая набирает обороты, но обычно она не используется для взлома веб-сайтов WordPress. Тем не менее, это отличный способ настроить культуру вокруг вашего сайта с учетом безопасности. Это потому, что лучшая защита от социальной инженерии — «Доверяй, но проверяй».
Всякий раз, когда клиент, пользователь или ваш начальник запрашивают что-то, связанное с безопасностью, лучший способ справиться с этим — довериться, но сначала проверить, правда ли то, что они говорят.
Клиент может заявить, что ему нужен доступ администратора к WordPress, но ваша задача — проверить, так ли это. Действительно ли им нужен доступ, или им не хватает только одной возможности в их роли? Есть ли способ решить эту проблему, не добавляя, возможно, новых векторов атаки?
«Доверяй, но проверяй» — это простая, но эффективная мантра, когда речь идет о секретных вопросах, и она действительно может помочь людям войти в курс дела.
Заключение
Является ли WordPress небезопасным? Нет, это не так. Ядро WordPress постоянно обновляется и исправляется, и большинство зарегистрированных взломов WordPress происходят не из самого WordPress. Является ли культура, окружающая WordPress, небезопасной? Еще бы!
Но, помня о безопасности каждой строки кода, которую вы пишете, каждого добавляемого пользователя, каждого плагина, который вы включаете, и каждого счета за хостинг, который вы оплачиваете, вы можете, по крайней мере, гарантировать, что используете безопасный веб-сайт, который сохранит вашу репутацию в целости и сохранности. безопасность данных.