Sé que Magento 2 tiene varios métodos disponibles para proteger la plantilla:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Pero me pregunto cuándo usar cada uno de esos métodos.
Los métodos de escape en AbstractBlock
todas las llamadas de delegado Magento\Framework\Escaper
, por lo que encontrará una descripción general allí.
Veamos los métodos públicos y su documentación:
/**
* 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)
Este debería ser su método de escape predeterminado para cualquier salida. La convención es que el resultado de todos los métodos que no contienen "Html" debe ser escapado.
( desde 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)
Use esto para escapar de la salida dentro de un atributo HTML, por ejemplo
title="<?php echo $block->escapeHtmlAttr($title) ?>"
Se escapará de HTML, pero también cita ( "
)
Por defecto, también escapará a las comillas simples, por lo que esto también funciona:
onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"
Establezca el segundo parámetro en falso si no se desea.
/**
* Escape URL
*
* @param string $string
* @return string
*/
public function escapeUrl($string)
Esto se puede usar para generar URL. Aplicará el escape HTML predeterminado y, además javascript:
, eliminará vbscript:
y data:
. Si desea evitar URLs como esta en enlaces proporcionados por el usuario, puede usar el método.
Hasta Magento 2.1, esta característica no estaba incluida y, en su escapeXssInUrl()
lugar, tenía que usarla . No había razón para usar escapeUrl()
en absoluto.
De lo contrario, solo utilícelo $block->escapeHtmlAttr()
para las URL.
( desde Magento 2.2 )
/**
* Encode URL
*
* @param string $string
* @return string
*/
public function encodeUrlParam($string)
Esto aplica la codificación URL a los parámetros. Para las URL internas que siempre debe usar getUrl()
, donde la codificación de URL ya está hecha para usted, por lo que esto solo es necesario si construye manualmente una URL externa.
( desde Magento 2.2 )
/**
* Escape string for the JavaScript context
*
* @param string $string
* @return string
*/
public function escapeJs($string)
Codifica caracteres unicode para JavaScript, por ejemplo, se ♥
convierte en \u2665
. Úselo para escapar de la salida dentro de una cadena JS . Para Javascript en línea (es decir, onclick
atributos), aún necesita llamar escapeHtmlAttr()
.
Tenga en cuenta que si lo usa json_encode()
, ya hace el mismo escape, en este caso, escapeJs()
no debe usarse.
( desde Magento 2.2 )
/**
* Escape string for the CSS context
*
* @param string $string
* @return string
*/
public function escapeCss($string)
Codifica caracteres unicode para CSS (ver escapeJs()
), por ejemplo para usar en el content
atributo CSS.
escapeHtmlAttr()
lugarescapeUrl()
lugarescapeHtmlAttr()
lugar
escapeHtmlAttr
yescapeHtmlAttr
no existe en 2.1.2 ... al menos no a/vendor/magento/framework/Escaper.php
menos que lo hayan agregado más tarde y etiquetado de nuevo magento ..Esto es para Magento 2.0. Para 2.1, consulte la respuesta de Fabian
escapeHtml
Utilice esta función en el caso de una salida de cadena que no debe contener HTML.
Ejemplo:
escapeQuote
Utilice esta función en el caso de los atributos HTML.
Ejemplo:
escapeUrl
Utilice esta función en caso de una salida URL (sin prevención XSS, solo conversión de caracteres)
Ejemplo:
escapeXssInUrl
Utilice esta función en caso de una salida URL (con prevención XSS, incluida la conversación de caracteres)
Ejemplo:
¿Qué no necesita escapar?
count()
(ejemploecho (int)$var
)echo 'test'
)echo "test"
)El
__
metodoEste se utiliza con fines de traducción. Úselo cuando sepa que una cadena se puede traducir.
Por ejemplo:
fuente
__()
también? Estoy un poco cansado de pegar en/* @escapeNotVerified */
todas partes: /__
no es para fines de seguridad sino para fines de traducciónecho $this->escapeHtml(__('Text to translate'))