Шорткоды в WordPress. Не все то хорошо, что в справке написано

Ваш отзыв

шорткоды на странице вордпресс

Добрый день, уважаемый читатель блога! Вероятно, Вы не раз слышали про шорткоды в WordPress, а может и неоднократно их использовали. Вообще говоря, правильная вещь, прямо из принципа программирования DRY — Don’t repeat yourself. Если у нас есть какое-то повторяющееся действие, то его надо выделить в отдельную функцию, а не копипастить одно и то же в 100500 мест. Учитывая, что напрямую PHP-код по умолчанию в WordPress выполнять нельзя, для этого нужны обходные пути. Читаем справку WordPress о том, как это сделать самостоятельно, применяем, вроде все ок. Но тут закрадывается нехорошая мысль… А что если…

Что такое шорткоды в WordPress

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

[my_shortcode]Какой-то текст[/my_shortcode]

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

Внедрены они были в далеком 2008 году в версии 2.5 нашей любимой CMS-ки. Сразу были добавлены такие стандартные коды, такие как caption, galary, video. Они с точки зрения кода считаются безопасными. Но не было бы в них смысла, если их нельзя было создавать самостоятельно. Вот тут и возникают некоторые проблемы. Что если у нас (это в лучшем случае, что у нас) проснулось желание схулиганить, и мы стали использовать шорткоды совсем не в добрых, пусть и тестовых, целях? Ведь что такое шорткод по своей сути ? Это хук, к которому прицепляется некоторая указанная нами функция. Он очень близок к обычному вордпрессовскому действию (т.е. action)  Вопрос первый — что мы передаем в функцию, вопрос второй — а что собственно делает эта функция? Итак, по порядку.

В справке вордпресса написано, что для создания примерно такого шорткода

Нам надо написать в functions.php темы или в самостоятельно созданном плагине такой код:

Этот код создает шорткод с выводимым контентом. Т.е. при открытии страницы в нее будет будет встроен следующий HTML-код

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

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

Теперь css-класс super_code не жестко прописан в коде, а лишь задан в качестве значения по умолчанию. Класс можно менять в атрибуте, например, так:

Внутри шорткодов могут находиться другие «подшорткоды». Это обеспечивается кодом

Функция do_shortcode($str) ищет шорткоды в передаваемом ей значении параметра $str. Если она их не находит, то просто передает текст как есть.

Т.е. Ваш блог не будет ошарашен  вот такой штукой:

шорткоды в WordPress

Теперь обратим особое внимание на сигнатуру функции:

function my_super_shortcode( $atts, $content = null )

Туда передается некий набор атрибутов и контент. Без этого никак, иначе в шорткодах можно было бы выводить только строго определенные данные, заданные в функции my_super_shortcode().

Создадим собственный шорткод

Окей, для теста я создала простой шорткод, который выводил бы на страницу записи некий текст, окруженный тегами <span>…</span>. Пусть это будет такой код в файле functions.php:

Теперь из чистого любопытства пишу в самой записи:

Сохраняю запись, перезагружаю страницу и вижу:

javascript в шорткодах

Круто !

Причем, заметьте, это был самый простой и безобидный вариант!

Можно поиздеваться над сайтом, поменяв ему фон страницы:

Да, я это делала… Там правда был вполне приличный постер игры GTA.

А можно загрузить и вредоносный JS-файл…

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

Будут вычищены HTML-теги и всякие inline-внедрения javascript (типа onclick=»some_function();»).

Начинаем интересоваться, неужели про это нигде не сказано? А, просто не в ту справку залезли . Вот тут четко написано про использование шорткодов в программировании:

Sanitize the input and escape the output

Переводя на русский язык совет из Best Practices, получаем «очищайте ввод и вывод данных». Нет, «санируйте ввод и эспейпите вывод» .

Вместо заключения

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

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

Есть вторая часть проблемы. Видимо, когда создавалась концепция этих «коротких кодов», никто не предполагал, что они будут использоваться фактически в обход существующей системы безопасности. Так, например, некоторые плагины их используют для отображения скрытой части контента, или для редактирования записей. Последнее в случае какой-то ошибки в коде легко может привести к повышению привилегий пользователя от читателя до писателя, как бы разработчики Вордпресса не старались сделать CMS-ку защищенной от таких угроз. А все потому, что выполнение кода может идти в обход стен Кремля системы безопасности.

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

P.S. Не по теме. Случайно опечаталась в слове «отдельную» из первого абзаца, кликнула правой кнопкой мыши и выбрала первый вариант, который предложил мне браузер. Он не часто ошибается. Перечитала. Браузер ошибочное слово заменил на «отельную». Даже у браузера предновогоднее настроение !

Подпишитесь на обновления блога!


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

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> <img src="" alt="" class="" width="" height="">

http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ab.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ac.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ag.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ah.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ai.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ak.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/am.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/an.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ao.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aq.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ar.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/at.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/av.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aw.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ay.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/az.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bb.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bc.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bd.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/be.gif 
больше...