¿Cómo escapar de los datos de salida?

Respuestas:

33

Existen varios métodos de ayuda según el contexto. Todos están definidos en Mage_Core_Helper_Abstractpero también en Mage_Core_Block_Abstract, por lo que puede usarlos $this->...()en cada plantilla:

  • escapeHtml(): En realidad, aprovecha htmlspecialcharslos parámetros recomendados para escapar de HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);- además, puede especificar una lista blanca de etiquetas permitidas y llamar al método en una matriz para escapar de todos los elementos a la vez. Use esto para cualquier texto en línea.
  • quoteEscape(): una versión más simple sin procesamiento de lista blanca y matriz, pero esta escapa a comillas simples y dobles, útil para texto dentro de un atributo HTML .
  • jsQuoteEscape(): este se escapa de las comillas simples con una barra diagonal inversa. Se utiliza para escapar de literales de cadena en JavaScript. Pero esto no es seguro . (Ejemplo de @Xorax:) 'test\\\'+alert("powned");//'. Es necesario escapar de las barras invertidas adicionales. Use en su quoteEscape()lugar!
  • escapeUrl(): No sé por qué existe este método, es que no la codificación URL cadenas, es simplemente viejo htmlspecialchars()sin ningún parámetro. No lo uses Siempre.

    /**
     * Escape html entities in url
     *
     * @param string $data
     * @return string
     */
    public function escapeUrl($data)
    {
        return htmlspecialchars($data);
    }
    
  • En una nota relacionada, existe la urlEncode()que tampoco aplica la codificación URL, sino la base64 en su lugar ... No la use, si no sabe exactamente lo que necesita.

    /**
     *  base64_encode() for URLs encoding
     *
     *  @param    string $url
     *  @return   string
     */
    public function urlEncode($url)
    {
        return strtr(base64_encode($url), '+/=', '-_,');
    }
    

Sí, el nombre es inconsistente. Una vez que todos esos nombres de métodos seguían el esquema, somethingEscape()pero alguien decidió desaprobar htmlEscape()y urlEscape()en favor de los nuevos métodos y se olvidó de quoteEscape()y jsQuoteEscape().

Fabian Schmengler
fuente
jsQuoteEscape ¿es realmente seguro? Parece que str_replace ($ quote, '\\'. $ Quote, ...) no hace el trabajo ... gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax
@Xorax muy buen punto. Actualizaré la respuesta.
Fabian Schmengler
21

Solo traduce

Siempre debe usar la función de traducción estándar

En una instancia de bloque

<?php echo $this->__('Text goes here'); ?>

En cualquier otro lugar

<?php echo Mage::helper('core')->__('Text goes here'); ?>

Y úselo de la misma manera que lo haría sprintfcon PHP

P.ej.

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

O escapar

En una instancia de bloque

<?php echo $this->escapeHtml('HTML goes here'); ?>

En cualquier otro lugar

Utilizando Mage/Core/Helper/Abstract.php

escapeHtml($data, $allowedTags = null)

P.ej.

<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Ben Lessani - Sonassi
fuente
Nota importante: Mage_Core_Block_Abstract::htmlEscape()está en desuso a partir de Magento v 1.4.0.0-rc1 y Mage_Core_Block_Abstract::escapeHtml()debe utilizarse en su lugar.
barell
55
Otra nota importante: la traducción no escapa a nada . Pruébelo: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler
3

Las clases Mage_Core_Block_Abstracty Mage_Core_Helper_Abstractambas usan la misma función Mage_Core_Helper_Abstract::escapeHtmly su implementación usa internamente la función htmlspecialchars de PHP además de implementar alguna lógica adicional para matrices con contenido HTML.

Se puede acceder a la función en todas las clases de bloque y ayuda a través de $ this y, dado que la función es pública, puede usarla a través de Mage :: helper ('core'), o alguna otra clase de ayuda, en cualquier otro lugar.

Domen Vrankar
fuente
-1

Para español convertido:

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