Magento 2: seguridad de la plantilla: ¿qué método usar?

29

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.

Raphael en Digital Pianism
fuente

Respuestas:

35

Los métodos de escape en AbstractBlocktodas 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:

escapeHtml ()

/**
 * 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.

escapeHtmlAttr ()

( 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.

escapeUrl ()

/**
 * 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.

encodeUrlParam ()

( 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.

escapeJs ()

( 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, onclickatributos), 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.

escapeCss ()

( 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 contentatributo CSS.

Métodos obsoletos (a partir de Magento 2.2):

  • escapeJsQuote: utilizar en su escapeHtmlAttr()lugar
  • escapeXssInUrl: utilizar en su escapeUrl()lugar
  • escapeQuote: use en su escapeHtmlAttr()lugar
Fabian Schmengler
fuente
1
Buen trabajo He agregado una pequeña nota a mi respuesta para referirme a la suya cuando uso 2.1. Curiosamente, la cláusula Magento U solo menciona los métodos que he mencionado en mi respuesta. Supongo que el curso es solo 2.0
Raphael en Digital Pianism
escapeHtmlAttry escapeHtmlAttrno existe en 2.1.2 ... al menos no a /vendor/magento/framework/Escaper.phpmenos que lo hayan agregado más tarde y etiquetado de nuevo magento ..
OZZIE
2
Buena captura, mi respuesta en realidad se basó en la última rama de desarrollo. Según los devdocs, los otros métodos quedarán en desuso desde 2.2
Fabian Schmengler
¿Hay algún método que se pueda usar para limpiar un fragmento arbitrario de html que podría necesitar una etiqueta img?
Corgalore el
¿Limpio en qué sentido?
Fabian Schmengler
14

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:

<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>

escapeQuote

Utilice esta función en el caso de los atributos HTML.

Ejemplo:

<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>

escapeUrl

Utilice esta función en caso de una salida URL (sin prevención XSS, solo conversión de caracteres)

Ejemplo:

<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>

escapeXssInUrl

Utilice esta función en caso de una salida URL (con prevención XSS, incluida la conversación de caracteres)

Ejemplo:

<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>

¿Qué no necesita escapar?

  • Tipo de fundición y función php count()(ejemplo echo (int)$var)
  • Salida entre comillas simples (ejemplo echo 'test')
  • Salida en comillas dobles sin variables (ejemplo echo "test")

El __metodo

Este se utiliza con fines de traducción. Úselo cuando sepa que una cadena se puede traducir.

Por ejemplo:

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
Raphael en Digital Pianism
fuente
buen trabajo .. rapheal
Amit Bera
1
¿Deberíamos escapar de todas las traducciones __()también? Estoy un poco cansado de pegar en /* @escapeNotVerified */todas partes: /
igloczek
@BartekIgielski ve mi respuesta actualizada. __no es para fines de seguridad sino para fines de traducción
Raphael en Digital Pianism
1
También recomiendo escapar de cadenas traducidas, comoecho $this->escapeHtml(__('Text to translate'))
KAndy
2
Actualmente hay una nota en la página de devdocs que algunos métodos serán obsoletos con 2.2. Asegúrese de volver a consultar la página de seguridad de la plantilla. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl