Очистка данных: лучшие практики с примерами кода

15

Я пытаюсь понять очистку данных (не проверку данных), чтобы помочь мне написать безопасные темы для WordPress. Я искал в Интернете, пытаясь найти исчерпывающее руководство для разработчиков тем с подробным описанием лучших практик. Я нашел несколько ресурсов, в том числе страницу кодекса под названием «Проверка данных», но ни один из них не был мне полезен. На странице кодекса перечислены доступные функции очистки, их использование и что они делают, но не объясняется, почему вы будете использовать одну над другой или в какой ситуации вы будете использовать определенную функцию очистки. Цель этого поста - попросить всех предоставить примеры плохого / неанизированного кода и того, как его следует переписать для правильной очистки. Это может быть общий код для дезинфекции заголовка поста или src post thumnails или более сложные коды, которые обрабатывают дезинфекцию$_POST данные для запросов Ajax.

Кроме того, я хотел бы знать, автоматически ли функции WordPress для добавления / обновления базы данных (например, упомянутые в блоке кода ниже) позаботятся о работе по очистке? Если да, то есть ли исключения, когда вы предпримете дополнительные меры для очистки данных, отправляемых в эти функции WordPress?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

Кроме того, нужно ли проводить очистку по-разному при отображении HTML-кода в PHP по сравнению с встроенным в HTML-кодом PHP? Чтобы быть более понятным из того, что я спрашиваю, вот код:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

Оба приведенных выше утверждения достигают одного и того же. Но нужно ли их дезинфицировать по-другому?

Джон
источник
1
Это могло бы помочь, если бы мы знали, что вы пытаетесь продезинфицировать. Темы предназначены для представления данных ... вам нужно только санировать данные, которые пользователь отправляет вам, а представления обычно обрабатываются плагинами.
EAMann
@EAMann Экранирующие функции, такие как esc_attr, esc_html и т. Д., Созданы для экранирования выходных данных. Поправь меня, если я ошибаюсь. Представление данных означает, что вы выводите данные, поэтому экранирование необходимо и в темах. В противном случае не было бы необходимости в функциях esc. Я хочу понимать очистку в темах WordPress в целом и не ограничиваться очисткой одного или двух фрагментов кода.
Джон
«Представление данных означает, что вы выводите данные, поэтому экранирование также необходимо в темах» - нет. Опять же, вам нужно только избежать данных, которым вы не доверяете
onetrickpony
@OneTrickPony Мне становится понятнее. Просто чтобы быть абсолютно уверенным, что я понимаю это - я избегал бы содержания комментариев, но не избежал бы идентификатора комментария или идентификатора поста, если бы я выводил их в HTML. Извините, я действительно задал вам вопросы один за другим.
Джон
2
«Вам нужно только избежать данных, которым вы не доверяете», - я полностью согласен. Единственное, что я хотел бы добавить, это то, что вы никогда не должны доверять данным;)
Ян Данн

Ответы:

12

Эта страница кодекса объясняет это довольно хорошо, я думаю.

Вероятно, самая важная и часто используемая функция esc_attr. Возьмите этот пример:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

Если $author_nameсодержит "символ, вы закрываете свой атрибут, и если за этим символом следуют, onclick="do_something();"это может ухудшиться :)

Выполнение print esc_attr($author_name)гарантирует, что такие символы закодированы, и браузер не делает то, что он не должен делать.

В одном случае вам это не нужно: когда вы ожидаете число, в этом случае вы можете просто преобразовать входные данные в целое число, например:

print (int)$_POST['some_number'];


Вышеперечисленные мета-функции уже заботятся о санации входных данных для хранилища базы данных, поэтому вам не нужно об этом беспокоиться.

Этот wpdb->prepare()метод необходимо использовать, когда вы выполняете запросы к БД самостоятельно. Вот пример:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

%sИ %dключевые слова заменяются с продезинфицировать значения _POST $.

Очень распространенная ошибка, которую я вижу во многих плагинах в репозитории WP.org, заключается в передаче ему уже подготовленного запроса (и плохо подготовленного), например:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

Не делай этого :)

Кроме того, нужно ли проводить очистку по-разному при отображении HTML-кода в PHP по сравнению с встроенным в HTML-кодом PHP?

Оба приведенных выше утверждения достигают одного и того же. Но нужно ли их дезинфицировать по-другому?

Нет.

onetrickpony
источник
Спасибо за ваш вклад. Ваше объяснение делает вещи более понятными для меня.
Джон
Небольшое уточнение необходимо дополнительно. Если я передаю строку в var (например, $ var = 'string';) в PHP и отображаю ее как атрибут HTML, я очищаю $ var при отображении. Или требуется только sanitize, если я извлек значение $ var из базы данных.
Джон
При отражении его на экране, так или иначе
onetrickpony
Итак, если я вас правильно понял, передал ли я строку в $ var в коде PHP или извлек данные из базы данных и передал в $ var, оба требуют, чтобы я выводил вывод. Верный?
Джон
Да, если эти данные поступают от пользователя, как, например, имя автора комментария. Если под «передачей строки в $ var в коде PHP» вы имеете в виду, что вы присвоили значение, которое вы знаете, переменной, то очевидно - нет, вам не нужно
очищать