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?

Raphael na Digital Pianism
fonte

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
Fabian Schmengler
fonte
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>
Raphael na Digital Pianism
fonte
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