Санітація даних: кращі практики з прикладами коду


15

Я намагаюся зрозуміти санітацію даних (не перевірку даних), щоб допомогти мені написати захищені теми для WordPress. Я здійснив пошук в Інтернеті, намагаючись знайти комплексний посібник для розробників тем, в якому детально описуються найкращі практики. Я натрапив на кілька ресурсів, включаючи сторінку кодексу під назвою Перевірка даних, хоча жоден мені не був корисний. На сторінці кодексу перераховані доступні функції санітарії, їх використання та те, що вони роблять, але не пояснено, чому ви б використовували одну над іншою або в якій ситуації ви використовували б певну функцію санітарії. Мета цієї публікації - просити всіх надати приклади поганого / несанітованого коду та того, як його слід переписати для належної санітарії. Це може бути загальним кодом для санітарії заголовка публікації або розміщення мініатюр src або більш детальних кодів, які обробляють санітарію$_POST дані для запитів Ajax.

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

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

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

<?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
"Вам потрібно лише уникати даних, яким ви не довіряєте", - я повністю згоден. Єдине, що я хотів би додати, це те, що ти ніколи не повинен довіряти даним;)
Ian Dunn

Відповіді:


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()Метод повинен бути використаний , коли ви робите DB запити самостійно. Ось приклад:

$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, як проти PHP, вбудованого в HTML?

Обидва вищезазначені твердження досягають одного і того ж. Але чи потрібно їх санітувати по-різному?

Ні.


Thx для ваших внесків. Твоє пояснення робить мене більш зрозумілими.
Джон

Далі потрібне невелике уточнення. Якщо я передаю рядок у var (напр., $ Var = 'string';) в PHP і повторюю її як атрибут HTML, чи я санітую $ var під час відлуння. Або потрібна санітарія, лише якщо я витягнув із бази даних значення $ var.
Джон

Коли лунає його на екрані, так чи інакше
onetrickpony

Отже, якщо я вас правильно зрозумів, чи передавав я рядок у $ var в межах PHP-коду, або витягував дані з бази даних і передавав у $ var, обидва вимагають від мене результатів. Правильно?
Джон

Так, якщо ці дані надходять від користувача, наприклад, ім'я автора коментаря. Якщо під "переданим рядком у $ var у PHP-коді" ви маєте на увазі, що ви присвоїли значенню значенню змінну, то, очевидно, - ні, вам не доведеться
санітувати

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