Мені відомо, що Magento 2 має кілька способів захистити шаблон:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Але мені цікаво, коли використовувати кожен із цих методів?
Мені відомо, що Magento 2 має кілька способів захистити шаблон:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Але мені цікаво, коли використовувати кожен із цих методів?
Відповіді:
Методи виходу в AbstractBlock
усі виклики делегатів Magento\Framework\Escaper
, тому ви знайдете огляд там.
Давайте розглянемо публічні методи та їх документацію:
/**
* 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".
( з 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, якщо це не бажано.
/**
* 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-адрес.
( з Magento 2.2 )
/**
* Encode URL
*
* @param string $string
* @return string
*/
public function encodeUrlParam($string)
Це стосується кодування URL до параметрів. Для внутрішніх URL-адрес завжди слід використовувати getUrl()
там, де кодування URL-адрес вже зроблено для вас, тому це необхідно лише в тому випадку, якщо ви вручну створили зовнішню URL-адресу.
( з 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()
не повинно використовуватися.
( з Magento 2.2 )
/**
* Escape string for the CSS context
*
* @param string $string
* @return string
*/
public function escapeCss($string)
Кодує символи Unicode для CSS (див. escapeJs()
), Наприклад, які будуть використані в content
атрибуті CSS.
escapeHtmlAttr()
замість цьогоescapeUrl()
замість цьогоescapeHtmlAttr()
замість цьогоescapeHtmlAttr
і escapeHtmlAttr
не існує в 2.1.2 ... по крайней мере , НЕ , /vendor/magento/framework/Escaper.php
якщо вони не будуть додані пізніше і повторно-міченого Magento ..
Це для 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>
count()
(приклад echo (int)$var
)echo 'test'
)echo "test"
)__
методЦей використовується для цілей перекладу. Використовуйте його, коли знаєте, що рядок можна перекласти.
Наприклад:
<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
__()
? Мені трохи набридло /* @escapeNotVerified */
__
не з метою безпеки, а з метою перекладу
echo $this->escapeHtml(__('Text to translate'))