¿Cómo escapar de los datos de salida?
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?
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 aprovechahtmlspecialchars
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. UsarquoteEscape()
¡en cambio!escapeUrl()
: No sé por qué existe este método, es no Cadenas de codificación de URL, es simplemente viejohtmlspecialchars()
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("<", ">"), array("<", ">"), htmlspecialchars("Lorem ipsum >", ENT_COMPAT, "UTF-8", false));