Pregunta

¿Existe un ayudante de magento incorporado para escapar de los datos de plantilla de salida para evitar XSS?

O debería simplemente usar el PHP htmlspecialchars o htmlentities funciones?

¿Fue útil?

Solución

Existen varios métodos auxiliares dependiendo del contexto. Todos están definidos en Mage_Core_Helper_Abstract pero también en Mage_Core_Block_Abstract, para que puedas usarlos con $this->...() En cada plantilla:

  • escapeHtml(): En realidad aprovecha htmlspecialchars con los 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 la lista blanca y matriz, pero esta escapa de citas individuales, así como cotizaciones dobles, útiles para texto dentro de un atributo HTML.
  • jsQuoteEscape(): Este escapa de citas individuales con una barra insegura. Se usa para escapar de los literales de cadena en JavaScript. Pero esto es no es seguro. (Ejemplo de @xorax: 'test\\\'+alert("powned");//'). Es necesario un escape adicional de barras trastas. Usar quoteEscape() ¡en cambio!
  • escapeUrl(): No sé por qué existe este método, es no Cadenas de codificación de URL, es simplemente viejo htmlspecialchars() sin ningún parámetro. No lo uses. Alguna vez.

    /**
     * Escape html entities in url
     *
     * @param string $data
     * @return string
     */
    public function escapeUrl($data)
    {
        return htmlspecialchars($data);
    }
    
  • En una nota relacionada, hay urlEncode() que tampoco aplica la codificación de URL, sino Base64 en su lugar ... No lo 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 siguieron el esquema somethingEscape() Pero entonces alguien decidió desaprobar htmlEscape() y urlEscape() a favor de los nuevos métodos y olvidé quoteEscape() y jsQuoteEscape().

Otros consejos

Solo tradúrelo

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 úsalo de la misma manera que usarías sprintf con PHP

P.ej.

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

O escapar de él

En una instancia de bloque

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

En cualquier otro lugar

Usando Mage/Core/Helper/Abstract.php

escapeHtml($data, $allowedTags = null)

P.ej.

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

Clases Mage_Core_Block_Abstract y Mage_Core_Helper_Abstract Ambos usan la misma función Mage_Core_Helper_Abstract::escapeHtml y su implementación internal utiliza la función PHP HTMLSpecialChars además de implementar una lógica de adición 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.

Para convertir español:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top