1.14.3: Escaping Rendered Data
Escaping rendered data
All (even seemingly trusted) outputs should be escaped on the frontend. This includes Store Configuration, product details, and of course, customer/order information.
Go to /teaching/escape for a practical example on these escapes.
\Magento\Framework\Escaper is exposed in every template with the $escaper variable (see the type name="Magento\Framework\View\TemplateEngine\Php reference in app/etc/di.xml). Thus, you have this available anywhere necessary.
escapeHtml($data, $allowedTags)
By NOT passing in $allowedTags, Magento runs the htmlspecialchars method. This is very performant. But if you do need to allow
some tags, Magento still prevents several from being allowed: script, img, embed, iframe, video, source, object, audio. For allowed tags, Magento filters attribute values, except for: id, class, href, title, style (the original value is allowed for these attributes).
Use cases:
- This is to be used anywhere values are rendered into raw HTML.
escapeHtmlAttr($string, $escapeSingleQuote)
This is used whenever you are writing a value into an HTML attribute (pretty self-explanatory).
Use cases:
- Writing a single value or JSON to an attribute.
escapeUrl($string)
This prevents javascript: and other identifiers from being added to a URL. htmlspecialchars are run on this twice. The second time this happens is when escapeHtml is also called on the input.
Use cases:
- Anytime you render a URL.
encodeUrlParam($string)
This escapes URL parameters. Magento currently uses this to filter incoming query parameters in a couple of locations.
Example:
\Magento\AdobeStockClient\Model\SearchParametersProvider\SimpleFilters::apply
escapeJs($string)
This evaluates all characters that are not in this list: a-z, 0-9, ",", ., _. It ensures all characters are UTF-8 compatible.
Then it is converted to a unicode reference.
escapeCss($string)
This ensures that CSS values are safe, specifically converting UTF-32 characters to UTF-8. See here: \Laminas\Escaper\Escaper::cssMatcher.
Note that there are a few deprecated methods that we are not discussing here.