Come sfuggire ai dati di output?


Risposte:


33

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().


jsQuoteEscape è davvero sicuro? Sembra che str_replace ($ quote, '\\'. $ Quote, ...) non faccia il lavoro ... gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax

@Xorax ottimo punto. Aggiornerò la risposta.
Fabian Schmengler,

21

Traducilo e basta

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); ?>

O scappare

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'); ?>

Nota importante: 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.
Barell,

5
Un'altra nota importante: la traduzione non sfugge a nulla . Provalo: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler,

3

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.


-1

Per convertire spagnolo:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.