Які найкращі практики безпеки для плагінів та тем WordPress? [зачинено]


22

Як запропоновано в цьому запитанні , я додаю цю тему як нове запитання для обговорення / голосування в громаді щодо найкращих практик безпеки плагінів / тем.

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

Якщо ви хочете перевірити тему на захищеній та суцільно закодованій сторінці налаштувань теми, перегляньте цю тему:
http://wordpress.org/extend/themes/coraline


Якщо хтось із відповідними привілеями не проти зробити цю вікі спільнотою?
Чіп Беннетт

Щоб отримати запитання у режимі вікі, мод повинен правильно позначити це питання , я позначив його модою, це зараз лише питання часу. :)
t31os

Що так особливого в кораліні? Imo, все ще є способи потрапити. Я б запропонував зв’язати anons A insted: wordpress.stackexchange.com/questions/13539/…
kaiser

У Кораліні може бути нічого особливого. Це просто той, на який ми зараз вказуємо розробникам Теми, переглядаючи теми, тому що це був приклад Джастіна Тадлока, який зробив багато початкових оглядів, що стосуються безпеки. Я б запропонував Енологію також як хороший приклад, але я не хочу натрапляти на те, щоб намагатися сутенерати власну Тему. :)
Чіп Беннетт

Відповіді:


13

Використовуйте безглузді (коли не використовуєте API налаштувань)

Плагіни та теми повинні явно забезпечувати перевірку сторінки сторінки налаштувань, якщо не використовується API налаштувань:


12

Санітизуйте, перевіряйте та скасовуйте дані

Очистити все, що може потрапити і вийти з (!) Бази даних як переднього, так і заднього!

Плагіни та теми повинні виконати належну перевірку даних:

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

Модулі і теми слід використовувати 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>

Ось чудове відео Марка Джакіта, що пояснює використання функцій, що протікають:


3
Санітизуйте по дорозі,
вирвіться

9

Використовуйте лише обережно $ _GET / $ _POST / $ _REQUEST і тоді, коли кращі API не доступні

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


3
Завжди ставитесь до $ _POST, $ _REQUEST та $ _GET як до небезпечних. Санітизуйте та додайте до білих значень ці масиви та вставте їх у власні змінні. Ніколи не саніруйте значення, що надходять від користувача, і не повертайте їх назад у $ _POST.
goldenapples

2
Завжди переконайтеся, що ключ, який потрібно використовувати, встановлений у відповідному масиві. isset () - ваш друг :)
mfields

9

Використовуйте $wpdb->prepare

Створюючи власні запити через $wpdbоб’єкт, завжди використовуйте $wpdb->prepareдля заповнення заповнювачів значеннями, а не пишіть запити даними, змішаними з кодом SQL, оскільки mysql_*сімейні функції неправильно навчали всіх.


$wpdb->prepareце НЕ те ж саме, підготовлені заяви.
hakre

8

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

Приємне читання для всіх, хто пише PHP: Експлуатовані функції PHP на StackOverflow.

Використовуйте API модифікації тем

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

Уникайте register_globals

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

Не створюйте файли із зайвими правами широкого доступу

Не створюйте файли з надто звільненими правами доступу.

Використовуйте SSL, коли це можливо

Наведіть свою долю на Twitter / Facebook / будь-які посилання на URI HTTPS, якщо вони доступні. Важлива і безпека вашого читача.


2
Чи можете ви детальніше зупинитися на set_theme_mod()тому, як правильно поєднувати його з використанням API API?
Чіп Беннетт

@Chip Bennett Я додав інформацію у свою відповідь.
фуксія

Чи можете ви розкласти цей міні-список на більш дрібні конкретні відповіді? Простіше керувати вікі спільноти меншими шматками. TIA
Rarst

3
Мікросхема: Тематична модна система не надто добре інтегрується з API налаштувань. Я напишу пост, де пояснюється, як це зробити незабаром незабаром.
Отто

7

Збережіть дані в одному масиві

Плагіни та теми повинні зберігати параметри в одному масиві, а не створювати кілька параметрів для сторінки налаштувань. Використання API налаштувань впорається з цим.


6

Перевірте відповідні можливості під час додавання та виведення сторінок налаштувань

Плагіни повинні використовувати відповідні можливості (наприклад manage_options) для можливості додавання сторінки налаштувань.

Теми повинні використовуватись edit_theme_optionsяк відповідна можливість додати сторінку налаштувань.


1
Невелика, але важлива примітка: однак ви не можете використовувати edit_theme_optionsз API налаштувань, але manage_optionsдля подання оновлень потрібне подання опцій . Зв'язаний квиток на Trac можна знайти тут .
t31os

Щоправда, але 1) це вплине лише на редакторів, а не на адміністраторів; та 2) сподіваємось, що це буде вирішено незабаром через пов'язаний квиток Trac.
Чіп Беннетт

Завжди є можливість присвоєння спеціальної ролі або звичайної ролі edit_theme_options, я вважав, що це може бути зручно зазначити, що API налаштувань у його поточному стані може використовуватися лише ролями, які мають manage_optionsможливість.
t31os

5

Використовуйте сучасні підручники та інформацію

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

Приклади того, що не робити :


1
Я додав трохи підкреслений текст, щоб вказати на посилання - це приклади того, що не потрібно робити, оскільки легко проскакувати інформацію та натиснути на посилання, не читаючи абзац, який передує їм. Також відповідь зробила трохи гарнішою, поки я був там ...;)
t31os

2
Це може використовувати трохи пояснень, які саме приклади навчальних посібників роблять неправильно та / або старим чином.
Рарст

4

Використовуйте API налаштувань

Плагіни та теми повинні використовувати API налаштувань, який простіший у використанні, більш захищений та забезпечує багато кропіткої роботи сторінок налаштувань:

Щоб ознайомитись із навчальними посібниками щодо використання API налаштувань, див.


Дивіться мій коментар до цієї відповіді стосовно API налаштувань та параметрів теми.
t31os

1

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


Насправді не є предметом безпеки, якщо я щось не пропускаю. Все ще дуже зручно і добре використовувати. :)
Rarst

Ну, можливо, а може й ні. Я бачив багато спеціального коду для виконання того ж самого. Більше спагеті з кодом = більше можливостей для введення ризиків для безпеки. :)
Чіп Беннетт

Беннет - від розсилки з toscho кілька днів тому - я думаю, я можу сказати це для нас обох - найпростіші функції для них набагато простіше читати та розуміти, ніж ці функції. Я не знижуюсь, але також не підтримую цього. Imo, це не повинно бути частиною ядра, оскільки це не додає ніякого значення.
кайзер

2
Мені цікаво, що ви придумали, що це простіше, ніж checked( $theme_options['whatever_option'] )або checked( 'some_value' == $theme_options['whatever_option'] ). Я не знаю, як це стає більш лаконічним, ніж це?
Чіп Беннетт

1

Функція префікса та назви змінних

Плагіни повинні префіксувати всі параметри, спеціальні функції, спеціальні змінні та власні константи із плагіном-слигом.

Теми повинні містити префікс усіх параметрів, користувацьких функцій, користувацьких змінних та спеціальних констант із темою slug.


Я б поширив це на всі назви класів, а також назви спеціальних об'єктів, таких як post_types та таксономії.
mfields


0

Додайте сторінки налаштувань до відповідних розділів меню адміністратора

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.