Magento 2: segurança do modelo: qual método usar?


29

Estou ciente de que o Magento 2 tem vários métodos disponíveis para proteger o modelo:

  • $block->escapeHtml()
  • $block->escapeQuote()
  • $block->escapeUrl()
  • $block->escapeXssInUrl()

Mas eu estou querendo saber quando usar cada um desses métodos?

Respostas:


35

Os métodos de escape em AbstractBlocktodos os delegados chamam para Magento\Framework\Escaperque você encontre uma visão geral lá.

Vejamos os métodos públicos e sua documentação:

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)

Esse deve ser o seu método de escape padrão para qualquer saída. A convenção é que o resultado de todos os métodos que não contêm "Html" deve 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 isso para escapar à saída dentro de um atributo HTML, por exemplo

title="<?php echo $block->escapeHtmlAttr($title) ?>"

Ele escapará do HTML, mas também aspas ( ")

Por padrão, ele também escapará de aspas simples, então isso também funciona:

onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"

Defina o segundo parâmetro como false se isso não for desejado.

escapeUrl ()

/**
 * Escape URL
 *
 * @param string $string
 * @return string
 */
public function escapeUrl($string)

Isso pode ser usado para gerar URLs. Ele aplicará o escape padrão do HTML e removerá adicionalmente javascript:, vbscript:e data:. Se você deseja impedir URLs como este nos links fornecidos pelo usuário, pode usar o método

Até o Magento 2.1, esse recurso não estava incluído e você precisava usá-lo escapeXssInUrl(). Não havia motivo para usar escapeUrl().

Caso contrário, use apenas $block->escapeHtmlAttr()para URLs.

encodeUrlParam ()

( desde Magento 2.2 )

/**
 * Encode URL
 *
 * @param string $string
 * @return string
 */
public function encodeUrlParam($string)

Isso aplica a codificação de URL aos parâmetros. Para URLs internas, você sempre deve usar getUrl(), onde a codificação de URL já foi feita para você, portanto isso só é necessário se você construir manualmente uma 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 exemplo, ♥torna-se \u2665. Use-o para escapar da saída dentro de uma sequência JS . Para Javascript embutido (ou seja, onclickatributos), você ainda precisa ligar escapeHtmlAttr().

Observe que, se você usar json_encode(), ele já faz o mesmo escape, neste caso, escapeJs()não deve ser usado.

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 (consulte escapeJs()), por exemplo, para ser usado no contentatributo CSS.

Métodos preteridos (a partir do Magento 2.2):

  • escapeJsQuote: use em escapeHtmlAttr()vez disso
  • escapeXssInUrl: use em escapeUrl()vez disso
  • escapeQuote: use em escapeHtmlAttr()vez disso

1
Bom trabalho Adicionei uma pequena nota à minha resposta para me referir à sua ao usar o 2.1. Curiosamente, o Magento U cita apenas os métodos que mencionei na minha resposta. Eu acho que o curso é somente 2.0
— Raphael no Digital Pianism

escapeHtmlAttre escapeHtmlAttrnão existe no 2.1.2 ... pelo menos não /vendor/magento/framework/Escaper.phpa menos que você adicionou-lo mais tarde e magento re-marcado ..
— OZZIE

2
Boa captura, minha resposta realmente foi baseada no último ramo de desenvolvimento. De acordo com os devdocs, os outros métodos serão descontinuados do 2.2.
— Fabian Schmengler

Existe um método que pode ser usado para limpar um pedaço arbitrário de html que pode precisar ter uma tag img?
— Corgalore

Limpo em que sentido?
— Fabian Schmengler

14

Isto é para o Magento 2.0. Para 2.1, consulte a resposta de Fabian

escapeHtml

Use esta função no caso de uma saída de sequência que não deve conter HTML.

Exemplo:

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

escapeQuote

Use esta função no caso de atributos HTML

Exemplo:

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

escapeUrl

Use esta função no caso de uma saída de URL (sem prevenção de XSS - apenas conversão de caracteres)

Exemplo:

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

escapeXssInUrl

Use esta função no caso de uma saída de URL (com prevenção XSS - incluindo conversação de caracteres)

Exemplo:

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

O que não precisa escapar?

  • Digite casting e função php count()(exemplo echo (int)$var)
  • Saída entre aspas simples (exemplo echo 'test')
  • Saída entre aspas duplas sem variáveis ​​(exemplo echo "test")

O __método

Este é usado para fins de tradução. Use-o quando souber que uma string pode ser traduzida.

Por exemplo:

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>

bom trabalho .. rapheal
— Amit Bera

1
Devemos escapar de todas as traduções __()também? Estou um pouco cansado de colar em /* @escapeNotVerified */todos os lugares: /
— igloczek

@BartekIgielski veja minha resposta atualizada. __Não é para fins de segurança, mas para fins de tradução
— Raphael em Digital pianismo

1
Também recomendo escapar seqüências de caracteres traduzidas, comoecho $this->escapeHtml(__('Text to translate'))
— KAndy

2
Atualmente, há uma observação na página devdocs de que alguns métodos serão preteridos na versão 2.2. Verifique novamente a página de segurança do modelo. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
— Anna Völkl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.