Я знаю, что в 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)
Кодирует символы Юникода для 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'))