Я знаю, что в 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.
Пример:
escapeQuote
Используйте эту функцию в случае атрибутов HTML
Пример:
escapeUrl
Используйте эту функцию в случае вывода URL (без предотвращения XSS - только преобразование символов)
Пример:
escapeXssInUrl
Используйте эту функцию в случае вывода URL-адреса (с предотвращением XSS - в том числе символьного разговора)
Пример:
Что не нужно убегать?
count()
(примерecho (int)$var
)echo 'test'
)echo "test"
)__
методЭтот используется для целей перевода. Используйте его, когда знаете, что строку можно перевести.
Например:
источник
__()
тоже? Я немного устал вставлять/* @escapeNotVerified */
везде: /__
не в целях безопасности, а в целях переводаecho $this->escapeHtml(__('Text to translate'))