Come sfuggire dati in uscita?
Domanda
C'è un aiutante built-in Magento per sfuggire dati del modello emessi per evitare XSS?
O devo solo usare il PHP htmlspecialchars
o funzioni htmlentities
?
Soluzione
Ci sono diversi metodo di supporto a seconda del contesto. Tutti sono definiti in Mage_Core_Helper_Abstract
ma anche in Mage_Core_Block_Abstract
, in modo da poter usarli con $this->...()
in ogni template:
-
escapeHtml()
: In realtà sfruttahtmlspecialchars
con i parametri consigliati per sfuggire HTML:$result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);
- inoltre è possibile specificare una whitelist di tag permessi e chiamare il metodo su un array di fuggire tutti gli elementi in una sola volta. Usa questo per qualsiasi testo in linea. -
quoteEscape()
: una versione più semplice, senza whitelist e l'elaborazione di array ma questo sfugge virgolette singole e doppie virgolette, utili per testo all'interno di un attributo HTML .
-
jsQuoteEscape()
: questo sfugge virgolette singole con un backslash. E 'utilizzato per fuggire letterali stringa in JavaScript. Ma questo è non sicuro . (Esempio da @Xorax:'test\\\'+alert("powned");//'
). Ulteriori fuga di backslash è necessario. UsaquoteEscape()
invece! -
escapeUrl()
: Non so il motivo per cui questo metodo esiste, di non URL codifica stringhe, è solo vecchiohtmlspecialchars()
pianura 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()
che, inoltre, non si applica la codifica URL, ma base64 invece ... non lo usate, se non si sa esattamente quello che ti serve./** * 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 i nomi dei metodi stavano seguendo la somethingEscape()
schema, ma poi qualcuno ha deciso di htmlEscape()
deprecate e urlEscape()
a favore dei nuovi metodi e dimenticati di quoteEscape()
e jsQuoteEscape()
.
Altri suggerimenti
Just tradurlo
Si dovrebbe sempre utilizzare lo standard funzione translate
In un'istanza di blocco
<?php echo $this->__('Text goes here'); ?>
In qualsiasi altro luogo
<?php echo Mage::helper('core')->__('Text goes here'); ?>
E usarlo allo stesso modo si usa sprintf
con PHP
Eg.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
O sfuggire
In un'istanza di blocco
<?php echo $this->escapeHtml('HTML goes here'); ?>
In qualsiasi altro luogo
Utilizzando Mage/Core/Helper/Abstract.php
escapeHtml($data, $allowedTags = null)
Eg.
<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Classi Mage_Core_Block_Abstract
e Mage_Core_Helper_Abstract
utilizzano entrambi la stessa funzione Mage_Core_Helper_Abstract::escapeHtml
e di implementazione utilizza internaly funzione PHP htmlspecialchars inoltre attuare una logica aditional per array con contenuto HTML.
La funzione è accessibile in tutte le classi di blocco e di supporto attraverso $ questo e dato che la funzione è pubblica si può utilizzare attraverso Mage :: helper ( 'core'), o di qualche altra classe di supporto, ovunque.
Per convertire spagnolo:
$value = str_replace(array("<", ">"), array("<", ">"), htmlspecialchars("Lorem ipsum >", ENT_COMPAT, "UTF-8", false));