Como escapar dos dados de saída?

Respostas:

33

Existem vários métodos auxiliares, dependendo do contexto. Todos são definidos em, Mage_Core_Helper_Abstractmas também em Mage_Core_Block_Abstract, para que você possa usá-los $this->...()em todos os modelos:

  • escapeHtml(): Na verdade, utiliza htmlspecialcharsos 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().

Fabian Schmengler
fonte
jsQuoteEscape é realmente seguro? Parece que str_replace ($ quote, '\\'. $ Quote
Xorax
@Xorax ponto muito bom. Vou atualizar a resposta.
Fabian Schmengler
21

Apenas traduza

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 sprintfcom PHP

Por exemplo.

<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>

Ou escapar

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'); ?>
Ben Lessani - Sonassi
fonte
Nota importante: Mage_Core_Block_Abstract::htmlEscape()está obsoleto no Magento v 1.4.0.0-rc1 e Mage_Core_Block_Abstract::escapeHtml()deve ser usado.
Barell
5
Outra nota importante: a tradução não escapa a nada . Experimentá-lo: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler
3

Classes Mage_Core_Block_Abstracte Mage_Core_Helper_Abstractambas usam a mesma função Mage_Core_Helper_Abstract::escapeHtmle 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.

Domen Vrankar
fonte
-1

Para espanhol converter:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
jruzafa
fonte