Я хочу переконатися, що всі дані в моїх плагінах / темах обробляються безпечно перед входом у базу даних та перед виведенням у браузер. Моя проблема полягає в тому, що існують ситуації, коли 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()). Якщо ви сумніваєтесь, саніруйте себе - це не зашкодить.