Як і коли використовувати filter_xss () та check_plain ()?


11

На views-view-fields--magazine--magazine.tpl.phpмоєму веб-сайті є багато файлів шаблонів, таких як цей . як і коли я повинен використовувати filter_xss () та check_plain () для покращення безпеки? наприклад, це код:

<div>
    <div class="bf-header bf-article-header"><?php print $fields['title']->content; ?></div>
    <div class="bf-article-body"><?php print $fields['field_magazine_body']->content;?></div>
    <div class="bf-article-image"><?php print $fields['field_magazine_image']->content;?></div>
</div>
<div class="separator article-view-separator"></div>

Як я можу застосувати ці функції в ньому?


Використовуйте, filter_xss()коли ви хочете відфільтрувати XSS з потенційно небезпечного контенту (тобто вмісту від ненадійного користувача), а check_plain()коли ви хочете уникнути спеціальних символів HTML із рядка
Clive

Відповіді:


13

Спочатку прочитайте про це в API Drupal:

Так check_plain()кодує спеціальні символи , які мають особливе значення в HTML (наприклад, <і &) в прості текстових об'єкти (тобто , &lt;і , &amp;відповідно) , які зроблять це буде буквально перекладаються (Не брати до уваги як HTML) , коли цей рядок, яка потім відображаються як частина сторінки з HTML-розмітка Функція filter_xss()фільтрує HTML-рядок для запобігання вразливості між веб-сайтами (XSS). Це чотири речі:

  • Видалення символів та конструкцій, які можуть обманути браузери
  • Переконайтеся, що всі об’єкти HTML добре сформовані
  • Переконайтесь, що всі теги та атрибути HTML добре сформовані
  • Переконайтеся, що жодні теги HTML не містять URL-адрес із забороненим протоколом (наприклад, JavaScript :)

Обидві функції використовуються для очищення даних від користувачів, щоб переконатися, що будь-яка ін'єкція користувача нейтралізується до того, як дані будуть відображені на вашому сайті.

Ви ніколи не пропускаєте одну і ту ж рядок через обидва .

Якщо ви використовуєте, check_plain()тоді рядок, переданий функції, повинен використовуватися як звичайний текст (а не HTML). Тоді filter_xss()вона не потрібна, оскільки check_plain()завжди буде робити рядок звичайним текстом.

Якщо ви користуєтесь filter_xss(), то строк, переданий функції, повинен бути HTML, і check_plain()зіпсує його.

Коли я дивлюся на шаблон, який ви використовуєте як приклад, мені здається, що всі три поля, які передаються, print()походять із вмісту, який уже дезінфікований, і більше не потребують санітарії.

Однак якщо ви створюєте власний модуль, який збирає введення користувача, не передаючи його через "безпечний" текстовий фільтр, наприклад "Фільтрований HTML" або "Звичайний", ви повинні використовувати ці функції для санітарії.


Де я можу перевірити, чи надходять дані від користувачів? наприклад, існує тип вмісту, і анонімним користувачам дозволено створювати такі вузли.
M ama D

@Drupalist, ви ніколи не повинні дозволяти анонімному користувачеві використовувати "небезпечний" текстовий формат. Перейдіть до Адміністрація »Конфігурація» Авторська робота »Формати тексту . "Безпечні" текстові формати, які постачаються з Drupal, - це "Фільтрований HTML" та "Звичайний текст". Якщо це єдині формати, дозволені анонімному користувачеві, Drupal виконує необхідні перевірки для будь-якого вбудованого типу вузла та будь-якого типу вузла, який ви створюєте за допомогою функції основних полів . Якщо ваш випадок використання відрізняється від цього, поставте нове запитання, в якому прописано випадок використання.
Безкоштовний радикал

Користувачі можуть використовувати лише анонімних користувачівplain text
M ama D,

@Drupalist, це добре. Не потрібно використовувати ці функції для очищення простого тексту.
Безкоштовний радикал

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