Esiste un helper Magento integrato per sfuggire ai dati del modello in uscita per prevenire XSS?
O dovrei semplicemente usare il PHP htmlspecialchars
o le htmlentities
funzioni?
Esiste un helper Magento integrato per sfuggire ai dati del modello in uscita per prevenire XSS?
O dovrei semplicemente usare il PHP htmlspecialchars
o le htmlentities
funzioni?
Risposte:
Esistono diversi metodi di supporto a seconda del contesto. Tutti sono definiti in Mage_Core_Helper_Abstract
ma anche in Mage_Core_Block_Abstract
, quindi puoi usarli con $this->...()
in ogni modello:
escapeHtml()
: In realtà sfrutta htmlspecialchars
i parametri consigliati per sfuggire all'HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);
- Inoltre puoi specificare una lista bianca di tag consentiti e chiamare il metodo su un array per sfuggire a tutti gli elementi contemporaneamente. Usalo per qualsiasi testo incorporato.quoteEscape()
: una versione più semplice senza whitelist ed elaborazione dell'array ma questa sfugge alle virgolette singole e doppie, utile per il testo all'interno di un attributo HTML .jsQuoteEscape()
: questo sfugge alle virgolette singole con una barra rovesciata. Viene utilizzato per sfuggire ai valori letterali delle stringhe in JavaScript. Ma questo non è sicuro . (Esempio di @Xorax:) 'test\\\'+alert("powned");//'
. È necessaria un'ulteriore fuga di barre rovesciate. Usa quoteEscape()
invece!escapeUrl()
: Non so il motivo per cui questo metodo esiste, è non URL codifica stringhe, è semplicemente vecchio htmlspecialchars()
, senza alcun parametro. Non usarlo. Mai.
/**
* Escape html entities in url
*
* @param string $data
* @return string
*/
public function escapeUrl($data)
{
return htmlspecialchars($data);
}
In una nota correlata, c'è urlEncode()
anche quello che non applica la codifica URL, ma base64 invece ... Non usarlo, se non sai esattamente di cosa hai bisogno.
/**
* base64_encode() for URLs encoding
*
* @param string $url
* @return string
*/
public function urlEncode($url)
{
return strtr(base64_encode($url), '+/=', '-_,');
}
Sì, la denominazione è incoerente. Una volta che tutti quei nomi di metodi seguivano lo schema somethingEscape()
ma poi qualcuno decise di deprecarsi htmlEscape()
e urlEscape()
favorire i nuovi metodi e di aver dimenticato quoteEscape()
e jsQuoteEscape()
.
Dovresti sempre utilizzare la funzione di traduzione standard
In un'istanza di blocco
<?php echo $this->__('Text goes here'); ?>
Da qualsiasi altra parte
<?php echo Mage::helper('core')->__('Text goes here'); ?>
E usalo come faresti sprintf
con PHP
Per esempio.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
In un'istanza di blocco
<?php echo $this->escapeHtml('HTML goes here'); ?>
Da qualsiasi altra parte
utilizzando Mage/Core/Helper/Abstract.php
escapeHtml($data, $allowedTags = null)
Per esempio.
<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Mage_Core_Block_Abstract::htmlEscape()
è obsoleto a partire da Magento v 1.4.0.0-rc1 e Mage_Core_Block_Abstract::escapeHtml()
deve essere utilizzato al suo posto.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Classi Mage_Core_Block_Abstract
e Mage_Core_Helper_Abstract
sia uso la stessa funzione Mage_Core_Helper_Abstract::escapeHtml
ed è implementazione utilizza internaly funzione PHP htmlspecialchars inoltre attuare una logica aditional per array con contenuto HTML.
È possibile accedere alla funzione in tutte le classi di blocchi e helper tramite $ this e poiché la funzione è pubblica è possibile utilizzarla tramite Mage :: helper ('core'), o qualche altra classe helper, ovunque.