Existe um auxiliar Magento embutido para escapar dos dados do modelo emitido e impedir o XSS?
Ou devo apenas usar o PHP htmlspecialchars
ou htmlentities
funções?
Existe um auxiliar Magento embutido para escapar dos dados do modelo emitido e impedir o XSS?
Ou devo apenas usar o PHP htmlspecialchars
ou htmlentities
funções?
Respostas:
Existem vários métodos auxiliares, dependendo do contexto. Todos são definidos em, Mage_Core_Helper_Abstract
mas também em Mage_Core_Block_Abstract
, para que você possa usá-los $this->...()
em todos os modelos:
escapeHtml()
: Na verdade, utiliza htmlspecialchars
os parâmetros recomendados para escapar do HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);
- além disso, você pode especificar uma lista de permissões de tags permitidas e chamar o método em uma matriz para escapar de todos os elementos de uma só vez. Use isso para qualquer texto embutido.quoteEscape()
: uma versão mais simples sem lista de permissões e processamento de matriz, mas esta escapa aspas simples e aspas duplas, útil para texto dentro de um atributo HTML .jsQuoteEscape()
: este escapa aspas simples com uma barra invertida. É usado para escapar literais de string em JavaScript. Mas isso não é seguro . (Exemplo de @Xorax:) 'test\\\'+alert("powned");//'
. É necessário um escape adicional de barras invertidas. Use em quoteEscape()
vez disso!escapeUrl()
: Não sei por que esse método existe, não é uma string de codificação de URL, é simplesmente antigo, htmlspecialchars()
sem nenhum parâmetro. Não use. Sempre.
/**
* Escape html entities in url
*
* @param string $data
* @return string
*/
public function escapeUrl($data)
{
return htmlspecialchars($data);
}
Em uma nota relacionada, existe o urlEncode()
que também não se aplica à codificação de URL, mas ao invés do base64 ... Não o use, se você não souber exatamente o que precisa.
/**
* base64_encode() for URLs encoding
*
* @param string $url
* @return string
*/
public function urlEncode($url)
{
return strtr(base64_encode($url), '+/=', '-_,');
}
Sim, a nomeação é inconsistente. Uma vez que todos esses nomes de métodos estavam seguindo o esquema somethingEscape()
, alguém decidiu reprovar htmlEscape()
e a urlEscape()
favor dos novos métodos e esqueceu-se de quoteEscape()
e jsQuoteEscape()
.
Você deve sempre usar a função de conversão padrão
Em uma instância de bloco
<?php echo $this->__('Text goes here'); ?>
Em qualquer outro lugar
<?php echo Mage::helper('core')->__('Text goes here'); ?>
E use da mesma maneira que você usaria sprintf
com PHP
Por exemplo.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
Em uma instância de bloco
<?php echo $this->escapeHtml('HTML goes here'); ?>
Em qualquer outro lugar
Usando Mage/Core/Helper/Abstract.php
escapeHtml($data, $allowedTags = null)
Por exemplo.
<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Mage_Core_Block_Abstract::htmlEscape()
está obsoleto no Magento v 1.4.0.0-rc1 e Mage_Core_Block_Abstract::escapeHtml()
deve ser usado.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Classes Mage_Core_Block_Abstract
e Mage_Core_Helper_Abstract
ambas usam a mesma função Mage_Core_Helper_Abstract::escapeHtml
e sua implementação usa internamente a função PHP htmlspecialchars, além de implementar alguma lógica adicional para matrizes com conteúdo HTML.
A função pode ser acessada em todas as classes de bloco e auxiliar através de $ this e, como a função é pública, você pode usá-la através do Mage :: helper ('core') ou de alguma outra classe auxiliar, em qualquer outro lugar.