¿Existe un ayudante de Magento incorporado para escapar de los datos de plantilla de salida para evitar XSS?
¿O debería usar el PHP htmlspecialchars
o las htmlentities
funciones?
¿Existe un ayudante de Magento incorporado para escapar de los datos de plantilla de salida para evitar XSS?
¿O debería usar el PHP htmlspecialchars
o las htmlentities
funciones?
Respuestas:
Existen varios métodos de ayuda según el contexto. Todos están definidos en Mage_Core_Helper_Abstract
pero también en Mage_Core_Block_Abstract
, por lo que puede usarlos $this->...()
en cada plantilla:
escapeHtml()
: En realidad, aprovecha htmlspecialchars
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 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 sprintf
con 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_Abstract
y Mage_Core_Helper_Abstract
ambas usan la misma función Mage_Core_Helper_Abstract::escapeHtml
y 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.