Статьи

Кодирование безопасных тем со встроенными функциями WordPress

Кодирование безопасных тем WordPress

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

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

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

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

Принципы безопасных разработчиков

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

Серьезный общий подход к написанию безопасных тем WordPress включает в себя уделение внимания следующим общим принципам:

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

Что нужно остерегаться

Наиболее распространенные угрозы, на которые нужно обратить внимание:

  • SQL-инъекции : злоумышленник внедряет вредоносный SQL-код, чтобы получить контроль над сервером базы данных сайта
  • Межсайтовый скриптинг (XSS) : злоумышленник внедряет вредоносный код JavaScript в веб-страницу
  • Подделка межсайтовых запросов (CSRF) : злоумышленник заставляет пользователей выполнять нежелательные действия на веб-сайте, где они проходят проверку подлинности.

Веб-безопасность постоянно развивается, поэтому важно быть в курсе последних угроз. Что касается WordPress, блог Sucuri — отличное место для изучения уязвимостей и атак.

Проверка данных, санитарная обработка и экранирование

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

Например, если вы собираете электронные письма пользователей через форму на своем веб-сайте, ваш код должен проверить, вводили ли пользователи какой-либо текстовый ввод (например, не какой-либо номер или вообще ничего) и соответствует ли этот ввод действительному адресу электронной почты. до ввода этих данных в базу данных.

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

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

Экранирование заключается в обеспечении безопасности отображения данных, например, в удалении специальных символов, кодировании символов HTML и т. Д. Рекомендуется избегать как можно позже , непосредственно перед отображением данных на экране.

Вы должны будете сделать много очистки и экранирования в темах WordPress. На самом деле, чтобы быть в безопасности, лучше всего дезинфицировать / удалять все динамические данные, то есть любые данные, которые не жестко запрограммированы в исходном коде HTML.

Функции проверки WordPress

Вы можете выполнить базовую проверку с помощью ряда удобных функций PHP.

Например, чтобы проверить, не существует ли переменная или для которой установлено значение false , вы можете использовать empty() .

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

  • Вы можете проверить, являются ли данные действительным адресом электронной почты, используя is_email( $email ) .

    Например:

     if ( is_email( 'test@domain.com' ) ) {
      echo 'valid email address.';
    }
  • Чтобы проверить действительные имена пользователей, WordPress делает доступными username_exists( $username ) :

     $username = 'testuser';
    if ( username_exists( $username ) ):
      echo "Username exists.";
    endif;
  • Чтобы убедиться, что тег, категория или другой термин таксономии существуют, вы можете использовать term_exists( $term, $taxonomy = '', $parent = null ) :

     //check if the category cats exists
    $term = term_exists('cats', 'category');
    if ($term !== 0 && $term !== null) {
      echo "The 'cats' category exists.";
    }
  • Чтобы убедиться в правильности пути к файлу (но не в том случае, если он существует), используйте validate_file( $file, $allowed_files ) :

     $path = 'uploads/2017/05/myfile.php';
    // returns 0 (valid path)
    return validate_file( $path );

WordPress Санирование / Экранирование

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

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

  • sanitize_email( $email ) удаляет данные всех символов, которые не допускаются на действительном адресе электронной почты. Вот пример, взятый из записи Кодекса :

     $sanitized_email = sanitize_email(' admin@example.com!  ');
    // will output: admin@example.com
    echo $sanitized_email;
  • sanitize_option( $option, $value ) очищает значения параметров, например, из входных данных Customizer, на основе характера параметра. Вот пример:

     sanitize_option( 'admin_email', 'admin@test.com!' );
  • sanitize_text_field( $str ) очищает строку, предоставленную пользователем или базой данных, но вы можете использовать ее для очистки любых данных, которые вы хотели бы видеть в виде простого текста:

     //Output: Heading Title
    echo sanitize_text_field('<h1>Heading Title</h1>');
  • sanitize_hex_color( $color ) и sanitize_hex_color_no_hash( $color ) работают в контексте настройщика WordPress.

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

    Первая функция проверяет шестнадцатеричную запись цвета с префиксом знака ##

    Пример из ссылки на код WordPress.org:

     $wp_customize->add_setting( 'accent_color', array(
      'default' => '#f72525',
      'sanitize_callback' => 'sanitize_hex_color',
    ) );
  • wp_kses_post( $data ) фильтрует содержимое, оставляя только разрешенные теги HTML. Это очень полезно в контексте Customizer в случаях, когда ваша тема позволяет пользователям вводить часть текста с форматированием HTML:

     function yourtheme_sanitize_html( $input ) {
      return wp_kses_post( force_balance_tags( $input ) );
    }
  • esc_html( $text ) — это простой способ экранирования блоков HTML. Например, если вы хотите вывести некоторый текст внутри тегов HTML, чтобы убедиться, что этот текст сам по себе не содержит тегов HTML или других недопустимых символов, вы можете написать:

     <h2><?php echo esc_html( $title ); ?></h2>
  • esc_url( $url ) отлично подходит, когда вы хотите проверить и очистить URL, в том числе внутри атрибутов hrefsrc Например:

     <a href="<?php esc_url( 'https://website.com' ); ?>">Awesome website</a>
  • esc_attr( $text ) используется везде, где ваша тема динамически выводит атрибут HTML:

     <a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home">
  • Вы можете использовать esc_textarea ($ text) для экранирования текстового ввода пользователя внутри текстовой области:

     <textarea><?php echo esc_textarea( $text ); ?></textarea>

Ресурсы

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

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

Если вы заинтересованы в разработке темы в целом, вы можете научиться создавать пустую тему с нуля в курсе SitePoint « Создайте свою первую тему WordPress» :