Я хочу переконатися, що всі дані в моїх плагінах / темах обробляються безпечно перед входом у базу даних та перед виведенням у браузер. Моя проблема полягає в тому, що існують ситуації, коли API обробляє санітарну обробку для вас - наприклад, під час збереження метаполя публікацій - та інші, коли автор плагіна / теми несе повну відповідальність за це - як, наприклад, під час збереження спеціальних налаштувань.
Що стосується цього питання, мене не хвилює перевірка даних на рівні домену - наприклад, перевірка того, чи є вікове поле у формі від 0 до 120, чи адреса електронної пошти є дійсною. Мене хвилює лише безпека - наприклад, уникнення запитів SQL, щоб уникнути ін'єкції SQL під час збереження в базі даних, або санітарії даних, що виводяться в шаблони HTML, щоб уникнути XSS.
Для санітарії виводу я знаю, що вам завжди потрібно використовувати такі функції, як esc_html()
і esc_attr()
коли лунають змінні у шаблонах HTML. Але що робити з використанням тегів шаблонів ? Чи всі вони вже санітують вихід? Якщо так, то для якого контексту (загальний HTML, атрибути тегів тощо)? Деякі функції мають варіанти для різних контекстів (як the_title_attribute()
, але більшість - ні.
Що стосується санітарії введення, я знаю, що мені потрібно користуватися $wpdb->prepare()
під час вручну запитів, але що робити при використанні API налаштувань для створення сторінки налаштувань плагіна або збереження метаполів публікації для користувацького типу публікації?
Зараз я просто перекопую Core та читаю підручники щоразу, коли використовую функцію, щоб дізнатися, чи вона санітирується чи ні, але це схильне до помилок і займає багато часу. Я сподіваюся знайти якийсь вичерпний перелік усіх можливих ситуацій та незалежно від того, чи API обробляє це чи ні. наприклад,
API перевіряє / дезінфікує
- Збереження мета публікації за допомогою
update_postmeta()
- Збереження мета користувача за допомогою
update_user_meta()
- Виведення назви посади - використовуйте контекстуально відповідний варіант
the_title()
- тощо
Ви повинні вручну перевірити / оздоровити
- Збереження параметрів плагіна за допомогою API налаштувань. Передати зворотний виклик як третій параметр
register_setting()
. - Прямі запити до бази даних: Загорніть запит
$wpdb->prepare()
. - Виведення змінних у HTML. Використання
esc_attr()
,esc_html()
і т.д. - тощо
Мені б також цікаво зрозуміти, чому API надає його в певних ситуаціях, але не в інших. Я припускаю, що це має щось спільне з невідомою природою даних, але я хотів би почути ґрунтовне пояснення.
the_title()
, і the_permalink()
т.д.) ви добре , але з одними даними ви не (наприклад get_post_meta()
). Якщо ви сумніваєтесь, саніруйте себе - це не зашкодить.