Что такое лучшие практики безопасности для плагинов WordPress и тем? [закрытый]

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

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

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

22
13.04.2017, 15:37
13 ответов

Используйте Данные случаи (если не использующий Настройки API)

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

13
19.02.2020, 21:56

Санируйте, проверьте и выйдите из данных

Санируйте что-либо, что могло войти и выйти из базы данных и фронтэнд и бэкэнд!

Плагины и Темы должны выполнить надлежащее подтверждение правильности данных:

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

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

Также доступный от API WordPress 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>

Вот большое видео Mark Jaquith, объясняющего использование функций выхода:

12
19.02.2020, 21:56
  • 1
    Санируйте на пути в, Escape на выходе.. :) –  t31os 31.03.2011, 01:04

Только используйте $ _GET / $ _POST / $ _REQUEST тщательно и когда лучшие API будут недоступны

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

9
19.02.2020, 21:56
  • 1
    Всегда рассматривайте $ _POST, $ _REQUEST и $ _GET как небезопасный. Санируйте и добавьте значения в белый список от тех массивов и поместите их в свои собственные переменные. Никогда не санируйте значения, прибывающие от пользователя, и откладывайте их в $ _POST. –  goldenapples 31.03.2011, 01:49
  • 2
    Всегда проверяйте, что ключ, который необходимо использовать, устанавливается в соответствующем массиве. isset () является Вашим другом :) –  mfields 18.04.2011, 11:32

Использовать $wpdb->prepare

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

9
19.02.2020, 21:56
  • 1
    $wpdb->prepare не то же как подготовленные операторы. –  hakre 17.08.2011, 15:01

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

Хорошее чтение для кого-либо пишущего PHP: Годный для использования PHP функционирует на StackOverflow.

Используйте модификацию темы API

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

Избегайте включил register_globals

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

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

Не создавайте файлы с, также освобождают права доступа.

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

Укажите на свою Долю на ссылках Twitter/Facebook/Anything на URI HTTPS при наличии. Безопасность Вашего читателя важна также.

8
19.02.2020, 21:56
  • 1
    Можете Вы уточнять set_theme_mod(), особенно, как правильно объединить его с использованием API Настроек? –  Chip Bennett 31.03.2011, 01:27
  • 2
    @Chip Bennett я добавил некоторую информацию к своему ответу. –  fuxia♦ 31.03.2011, 01:42
  • 3
    можно ли сломать этот мини-список в меньших более определенных ответах? Легче управлять общественной Wiki в меньших блоках. TIA –  Rarst 31.03.2011, 18:23
  • 4
    Chip: система модификации Темы не интегрирует слишком хорошо с Настройками API. Я опишу сообщение, объясняющее, как сделать его правильно когда-то скоро. –  Otto 02.04.2011, 01:17

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

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

7
19.02.2020, 21:56

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

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

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

6
19.02.2020, 21:56
  • 1
    Маленькое но важное примечание: Вы не можете использовать edit_theme_options с настройками API, хотя, представление опции трудно кодируется для требования manage_options для представления обновлений. Связанный билет Trac может быть найден здесь. –  t31os 31.03.2011, 00:35
  • 2
    Правда, но 1) это только повлияет на Редакторов, не Администраторов; и 2) надо надеяться который будет скоро обращен, с помощью связанного билета Trac. –  Chip Bennett 31.03.2011, 00:56
  • 3
    Всегда существует возможность пользовательской роли или регулярной роли, даваемой edit_theme_options ограничение к, я думал, что могло бы быть удобно указать, что настройки API в он - текущее состояние, только применимо ролями с manage_options возможность. –  t31os 31.03.2011, 01:01

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

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

Примеры того, какой не сделать:

5
19.02.2020, 21:56
  • 1
    я включил немного подчеркнутого текста для указания на ссылки, является примерами того, какой не сделать, поскольку легко скользить через информацию и нажать на ссылки, не читая абзац, который предшествует им. Также сделанный ответом, немного более симпатичным, пока я был там... ;) –  t31os 31.03.2011, 00:27
  • 2
    Это могло использовать бит объяснения, что точно учебные руководства в качестве примера делают неправильным и/или старым способом. –  Rarst 31.03.2011, 23:24

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

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

Для пользы учебные руководства при использовании Настроек API см.:

4
19.02.2020, 21:56

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

1
19.02.2020, 21:56
  • 1
    Едва ли вещь безопасности, если я не пропускаю что-то. Все еще очень удобный и хороший для использования. :) –  Rarst 31.03.2011, 23:39
  • 2
    ну, возможно, и возможно нет. Я видел МНОГО пользовательского кода для выполнения того же самого. Больше спагетти кода = больше возможностей представить угрозы безопасности. :) –  Chip Bennett 31.03.2011, 23:49
  • 3
    Bennet - от отправки по почте с toscho несколько дней назад - я предполагаю, что могу сказать это для нас обоих - самые простые функции для того, которые намного легче читать и понять, чем те функции. Я не снижаюсь - но также и не upvotings это. Imo это не должно быть частью ядра, поскольку он не добавляет значения. –  kaiser 01.04.2011, 06:29
  • 4
    мне любопытно, что Вы парни придумали, это легче, чем checked( $theme_options['whatever_option'] ) или checked( 'some_value' == $theme_options['whatever_option'] ). Я не знаю, как это становится более сжатым, чем это? –  Chip Bennett 01.04.2011, 15:55

Имена функций префикса и имена переменной

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

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

1
19.02.2020, 21:56
  • 1
    я расширил бы это до всех имен классов, а также названий пользовательских объектов как post_types и taxonomies. –  mfields 18.04.2011, 11:29

Используйте wp_safe_redirect () вместо того, чтобы назвать заголовок php () функцией непосредственно при направлении к странице на том же домене.

1
19.02.2020, 21:56

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

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

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

0
19.02.2020, 21:56

Теги

Похожие вопросы