Magento 2: безпека шаблону: який метод використовувати?


Відповіді:


35

Методи виходу в AbstractBlockусі виклики делегатів Magento\Framework\Escaper, тому ви знайдете огляд там.

Давайте розглянемо публічні методи та їх документацію:

escapeHtml ()

/**
 * Escape string for HTML context. allowedTags will not be escaped, except the following: script, img, embed,
 * iframe, video, source, object, audio
 *
 * @param string|array $data
 * @param array|null $allowedTags
 * @return string|array
 */
public function escapeHtml($data, $allowedTags = null)

Це повинен бути вашим методом виходу за замовчуванням для будь-якого виводу. Конвенція полягає в тому, що слід уникати результату всіх методів, які не містять "Html".

escapeHtmlAttr ()

( з Magento 2.2 )

/**
 * Escape a string for the HTML attribute context
 *
 * @param string $string
 * @param boolean $escapeSingleQuote
 * @return string
 */
public function escapeHtmlAttr($string, $escapeSingleQuote = true)

Використовуйте це, щоб уникнути виводу, наприклад, в атрибуті HTML

title="<?php echo $block->escapeHtmlAttr($title) ?>"

Він уникне HTML, але також цитати ( ")

За замовчуванням він також уникатиме одинарних лапок, тому це також працює:

onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"

Встановіть другий параметр значення false, якщо це не бажано.

escapeUrl ()

/**
 * Escape URL
 *
 * @param string $string
 * @return string
 */
public function escapeUrl($string)

Це можна використовувати для виведення URL-адрес. Він буде застосовуватися по замовчуванням HTML Екранування і додатково видаляє javascript:, vbscript:і data:. Якщо ви хочете запобігти подібним URL-адресам у наданих користувачем посиланнях, ви можете скористатися методом.

До Magento 2.1 ця функція не була включена, і вам потрібно було скористатися escapeXssInUrl()натомість. Причин для використання escapeUrl()взагалі не було.

В іншому випадку просто використовуйте $block->escapeHtmlAttr()для URL-адрес.

encodeUrlParam ()

( з Magento 2.2 )

/**
 * Encode URL
 *
 * @param string $string
 * @return string
 */
public function encodeUrlParam($string)

Це стосується кодування URL до параметрів. Для внутрішніх URL-адрес завжди слід використовувати getUrl()там, де кодування URL-адрес вже зроблено для вас, тому це необхідно лише в тому випадку, якщо ви вручну створили зовнішню URL-адресу.

escapeJs ()

( з Magento 2.2 )

/**
 * Escape string for the JavaScript context
 *
 * @param string $string
 * @return string
 */
public function escapeJs($string)

Кодуються символи Юнікоду для JavaScript, наприклад , стає \u2665. Використовуйте його, щоб уникнути виходу в рядок JS . Для вбудованого Javascript (тобто onclickатрибутів) вам все одно потрібно зателефонувати escapeHtmlAttr().

Зауважте, що якщо ви користуєтесь json_encode(), це вже робить те саме, що і в цьому випадку escapeJs()не повинно використовуватися.

escapeCss ()

( з Magento 2.2 )

/**
 * Escape string for the CSS context
 *
 * @param string $string
 * @return string
 */
public function escapeCss($string)

Кодує символи Unicode для CSS (див. escapeJs()), Наприклад, які будуть використані в contentатрибуті CSS.

Застарілі методи (станом на Magento 2.2):

  • escapeJsQuote: Використовуйте escapeHtmlAttr()замість цього
  • escapeXssInUrl: використовувати escapeUrl()замість цього
  • escapeQuote: Використовуйте escapeHtmlAttr()замість цього

1
Хороша робота Я додав невеличку замітку до своєї відповіді, щоб посилатися на вашу при використанні 2.1. Цікаво, що Magento U couse згадує лише методи, про які я згадував у своїй відповіді. Я здогадуюсь, що курс лише 2,0
Рафаель у Digital Pianism

escapeHtmlAttrі escapeHtmlAttrне існує в 2.1.2 ... по крайней мере , НЕ , /vendor/magento/framework/Escaper.phpякщо вони не будуть додані пізніше і повторно-міченого Magento ..
Ozzie

2
Хороший улов, моя відповідь насправді ґрунтувалася на останній галузі розвитку. За словами девдокона, інші методи будуть застаріли з 2.2
Фабіан Шменглер

Чи є метод, який може бути використаний для очищення довільного фрагмента html, який, можливо, повинен мати в ньому тег img?
Коргалоре

Чисто в якому сенсі?
Фабіан Шменглер

14

Це для Magento 2.0. У розділі 2.1 див. Відповідь Фабіана

escapeHtml

Використовуйте цю функцію у випадку виведення рядка, який не повинен містити HTML.

Приклад:

<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>

escapeQuote

Використовуйте цю функцію у випадку атрибутів HTML

Приклад:

<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>

escapeUrl

Використовуйте цю функцію у випадку виходу URL-адреси (без запобігання XSS - лише перетворення символів)

Приклад:

<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>

escapeXssInUrl

Використовуйте цю функцію у випадку виходу URL-адреси (із запобіганням XSS - включаючи розмову символів)

Приклад:

<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>

Чого не потрібно бігти?

  • Введіть функції кастингу та php count()(приклад echo (int)$var)
  • Виведення в одиничних лапках (приклад echo 'test')
  • Виведення в подвійних лапках без змінних (приклад echo "test")

__метод

Цей використовується для цілей перекладу. Використовуйте його, коли знаєте, що рядок можна перекласти.

Наприклад:

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>

хороша робота .. rapheal
Аміт Бера

1
Чи слід також уникати кожного перекладу __()? Мені трохи набридло /* @escapeNotVerified */
скріплювати

@BartekIgielski дивіться мою оновлену відповідь. __не з метою безпеки, а з метою перекладу
Рафаель у Digital Pianism

1
Також рекомендую уникнути перекладених рядків, наприкладecho $this->escapeHtml(__('Text to translate'))
Кенді

2
Наразі на сторінці devdocs є примітка про те, що деякі методи будуть застаріли з 2.2. Обов’язково перевірте ще раз на сторінці безпеки шаблону. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.