Каковы рекомендации по безопасности для плагинов и тем WordPress? [закрыто]

22

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

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

Если вы хотите проверить тему с помощью безопасной и прочно закодированной страницы настроек темы, проверьте эту тему:
http://wordpress.org/extend/themes/coraline

Чип Беннетт
источник
Если кто-то с соответствующими привилегиями не против сделать это вики-сообществом?
Чип Беннетт
Чтобы получить вопрос в вики-режиме, мод должен правильно пометить вопрос , я пометил его для модного внимания, это просто вопрос времени .. :)
t31os
Что такого особенного в коралине? По-моему, есть еще способы войти. Я бы предложил связать анонс. Insted: wordpress.stackexchange.com/questions/13539/…
kaiser
В Коралине не может быть ничего особенного. Это просто тот, на который мы в настоящее время указываем разработчикам Тем при рассмотрении Тем, потому что это был пример, приведенный Джастином Тэдлоком, который сделал много начальных обзоров Темы, касающихся безопасности. Я бы предложил Энологию также в качестве хорошего примера, но я не хочу, чтобы я пытался развить мою собственную тему. :)
Чип Беннетт

Ответы:

13

Использовать одноразовые номера (если не используется API настроек)

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

Rarst
источник
12

Обеззараживать, проверять и удалять данные

Дезинфицируйте все, что может входить и выходить из (!) Базы данных, как переднего, так и внутреннего!

Плагины и темы должны выполнять правильную проверку данных:

  1. Проверяйте и очищайте все ненадежные данные перед вводом данных в базу данных.
  2. Удалить все ненадежные данные перед выводом в поля формы Настройки
  3. Удалить все ненадежные данные перед выводом в файлы шаблона Theme

Плагины и Темы следует использовать esc_attr()для ввода текста esc_html()или esc_textarea()для текстовых областей.

Также доступны из WordPress API является esc_url(), esc_url_raw(), esc_js()и wp_filter_kses().

Плохой пример:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Хороший пример:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Вот отличное видео Марка Джакита, объясняющее использование экранирующих функций:

Chris_O
источник
3
Санируйте по дороге,
убегайте
9

Используйте $ _GET / $ _POST / $ _REQUEST только осторожно, и когда лучшие API недоступны

Плагины и темы должны использовать API настроек для получения и сохранения входных данных формы, а не полагаться на них $_POSTи $_REQUESTданные напрямую.

Rarst
источник
3
Всегда рассматривайте $ _POST, $ _REQUEST и $ _GET как небезопасные. Очистите и внесите значения в белый список из этих массивов и поместите их в свои собственные переменные. Никогда не очищайте значения, поступающие от пользователя, и помещайте их обратно в $ _POST.
золотые яблоки
2
Всегда проверяйте, что ключ, который вам нужно использовать, установлен в соответствующем массиве. isset () твой друг :)
mfields
9

использование $wpdb->prepare

При построении пользовательских запросов через $wpdbобъект всегда используйте $wpdb->prepareдля заполнения заполнителей значениями, а не для написания запросов с данными, смешанными с кодом SQL, так как mysql_*функции семейства неправильно учили всех.

Matteo Riva
источник
$wpdb->prepareэто не то же самое, что подготовленные заявления.
Хакре
8

Будьте осторожны с функциями PHP, которые могут быть использованы для запуска вредоносного кода

Хорошее чтение для тех, кто пишет PHP: эксплуатируемые функции PHP в StackOverflow.

Используйте Theme Modification API

Темы должны использовать set_theme_mod()и связанные с ними функции, а не собственную схему имен.
API theme_mod - это специализированный уровень для API настроек; он гарантирует уникальные имена, помещает все параметры в один массив и, по моему опыту, намного проще в обращении. Кроме того, он предлагает стандартные фильтры для плагинов - что хорошо для совместимости.

Избегать включен register_globals

Не надейся register_globals = on. Pro Theme , который мой последний клиент купил делает именно это. Я мог взломать любой сайт, используя эту тему за 5 минут ...
ThimbThumb сделал это тоже (и до сих пор делает?).

Не создавайте файлы с ненужными разрешениями широкого доступа

Не создавайте файлы с слишком свободными правами доступа.

Используйте SSL, где это возможно

Направьте свою ссылку в Twitter / Facebook / Anything на ссылки HTTPS, если они доступны. Безопасность вашего читателя тоже важна.

Фуксия
источник
2
Можете ли вы уточнить set_theme_mod(), в частности, как правильно сочетать его с использованием API настроек?
Чип Беннетт
@Chip Bennett Я добавил некоторую информацию в свой ответ.
fuxia
Можете ли вы разбить этот мини-список на более мелкие и конкретные ответы? Легче управлять сообществом вики небольшими порциями. TIA
Rarst
3
Чип: Theme мод система не слишком хорошо интегрируется с API настроек. Я напишу пост, объясняющий, как сделать это правильно в ближайшее время.
Отто
7

Сохранить данные в одном массиве

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

Chip Bennett
источник
6

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

Плагины должны использовать соответствующие возможности (например manage_options) для возможности добавления страницы настроек.

Темы следует использовать edit_theme_optionsв качестве соответствующей возможности для добавления страницы настроек.

Rarst
источник
1
Небольшое, но важное примечание: вы не можете использовать edit_theme_optionsAPI настроек, хотя параметр manage_optionsотправки жестко запрограммирован для отправки обновлений. Связанный билет Trac можно найти здесь .
t31os
Правда, но 1) это повлияет только на редакторов, а не на администраторов; и 2) надеюсь, что это будет решено в ближайшее время, через связанный билет Trac.
Чип Беннетт
Всегда существует возможность для пользовательской роли или обычной роли, которая edit_theme_optionsограничена, я подумал, что было бы удобно указать, что API настроек в его текущем состоянии может использоваться только ролями с manage_optionsвозможностью.
t31os
5

Используйте современные учебные пособия и информацию

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

Примеры того, что не нужно делать :

t31os
источник
1
Я добавил немного подчеркнутого текста, чтобы указать, что ссылки являются примерами того, чего не следует делать, поскольку легко просмотреть информацию и щелкнуть ссылки, не читая предшествующий им абзац. Также сделал ответ немного красивее, пока я был там ...;)
t31os
2
Это могло бы использовать немного объяснения, что именно учебники примера делают неправильно и / или старым способом.
августа
4

Используйте API настроек

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

Хорошие учебники по использованию API настроек смотрите:

Chip Bennett
источник
Смотрите мой комментарий к этому ответу относительно настроек API и параметров темы.
t31os
1

Для флажков и выбора опций, плагины и темы должны использовать checked()и selected()функцию для вывода checked="checked"и selected="selected", соответственно.

Чип Беннетт
источник
На самом деле не в безопасности, если я что-то упустил. Все еще очень удобно и хорошо для использования. :)
Rarst
Ну, может быть, а может и нет. Я видел много пользовательского кода для выполнения того же самого. Больше кода спагетти = больше возможностей для введения угроз безопасности. :)
Чип Беннетт
Беннет - от рассылки toscho несколько дней назад - я думаю, что могу сказать это для нас обоих - самые простые функции для этого намного легче читать и понимать, чем эти функции. Я не разочарован, но и не одобряю это. По моему мнению, это не должно быть частью ядра, так как это не добавляет никакой ценности.
Кайзер
2
Мне любопытно, что вы, ребята, придумали, что это проще, чем checked( $theme_options['whatever_option'] )или checked( 'some_value' == $theme_options['whatever_option'] ). Я не знаю, как это становится более кратким, чем это?
Чип Беннетт
1

Префиксная функция и имена переменных

Плагины должны иметь префикс всех опций, пользовательских функций, пользовательских переменных и пользовательских констант с помощью plugin-slug.

Темы должны иметь префикс всех опций, пользовательских функций, пользовательских переменных и пользовательских констант с theme-slug.

Chip Bennett
источник
Я хотел бы распространить это на все имена классов, а также имена пользовательских объектов, таких как post_types и таксономии.
Мфилдс
0

Добавить страницы настроек в соответствующие разделы меню администратора

Плагины должны использовать add_options_page()функцию добавления страницы настроек плагинов в Settingsменю, а не add_menu_page()добавлять меню верхнего уровня.

Темы должны использовать add_theme_page()функцию для добавления страницы настроек темы в Appearanceменю, а не add_menu_page()для добавления меню верхнего уровня.

Chip Bennett
источник