Я хочу убедиться, что все данные в моих плагинах / темах надежно обрабатываются перед входом в базу данных и перед выводом в браузер. Моя проблема в том, что есть ситуации, когда 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 настроек. Передайте обратный вызов в качестве 3-го параметра
register_setting()
. - Прямые запросы к базе данных: заверните запрос в
$wpdb->prepare()
. - Вывод переменных в HTML. Использование
esc_attr()
,esc_html()
и т.д. - и т.д
Мне также было бы интересно понять, почему API предоставляет его в определенных ситуациях, а не в других. Я предполагаю, что это как-то связано с неизвестной природой данных, но хотелось бы услышать подробное объяснение.
the_title()
и the_permalink()
т. Д.), У вас все хорошо, но с пользовательскими данными у вас нет (например get_post_meta()
). Если сомневаетесь, санируйте себя - это не повредит.