Esiste un helper Magento integrato per sfuggire ai dati del modello in uscita per prevenire XSS?
O dovrei semplicemente usare il PHP htmlspecialcharso le htmlentitiesfunzioni?
Esiste un helper Magento integrato per sfuggire ai dati del modello in uscita per prevenire XSS?
O dovrei semplicemente usare il PHP htmlspecialcharso le htmlentitiesfunzioni?
Risposte:
Esistono diversi metodi di supporto a seconda del contesto. Tutti sono definiti in Mage_Core_Helper_Abstractma anche in Mage_Core_Block_Abstract, quindi puoi usarli con $this->...()in ogni modello:
escapeHtml(): In realtà sfrutta htmlspecialcharsi 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 sprintfcon 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_Abstracte Mage_Core_Helper_Abstractsia uso la stessa funzione Mage_Core_Helper_Abstract::escapeHtmled è 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.