¿Existe un ayudante de Magento incorporado para escapar de los datos de plantilla de salida para evitar XSS?
¿O debería usar el PHP htmlspecialcharso las htmlentitiesfunciones?
¿Existe un ayudante de Magento incorporado para escapar de los datos de plantilla de salida para evitar XSS?
¿O debería usar el PHP htmlspecialcharso las htmlentitiesfunciones?
Respuestas:
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().
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); ?>
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'); ?>
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.
$this->__('Hello %s', '<script>alert("XSS!")</script>').
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.