Jak uciec danych wyjściowych?

Odpowiedzi:

33

Istnieje kilka metod pomocniczych w zależności od kontekstu. Wszystkie są zdefiniowane w, Mage_Core_Helper_Abstractale także w Mage_Core_Block_Abstract, więc możesz używać ich z $this->...()każdym szablonem:

  • escapeHtml(): W rzeczywistości wykorzystuje htmlspecialcharszalecane parametry do ucieczki HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);- dodatkowo można określić białą listę dozwolonych tagów i wywołać metodę na tablicy, aby uciec od wszystkich elementów jednocześnie. Użyj tego dla dowolnego tekstu wstawianego.
  • quoteEscape(): prostsza wersja bez białej listy i przetwarzania tablic, ale ta unika pojedynczych cudzysłowów, a także podwójnych cudzysłowów, użytecznych dla tekstu w atrybucie HTML .
  • jsQuoteEscape(): ten unika pojedynczych cudzysłowów odwrotnym ukośnikiem. Służy do ucieczki literałów łańcuchowych w JavaScript. Ale to nie jest bezpieczne . (Przykład autorstwa @Xorax:) 'test\\\'+alert("powned");//'. Konieczne jest dodatkowe unikanie ukośników odwrotnych. Użyj quoteEscape()zamiast tego!
  • escapeUrl(): Nie wiem, dlaczego ta metoda istnieje, nie jest to ciąg znaków kodowania adresu URL, jest po prostu stary htmlspecialchars()bez żadnego parametru. Nie używaj tego. Zawsze.

    /**
     * Escape html entities in url
     *
     * @param string $data
     * @return string
     */
    public function escapeUrl($data)
    {
        return htmlspecialchars($data);
    }
    
  • W pokrewnej notatce jest urlEncode()też kodowanie URL, ale zamiast tego base64 ... Nie używaj go, jeśli nie wiesz dokładnie, czego potrzebujesz.

    /**
     *  base64_encode() for URLs encoding
     *
     *  @param    string $url
     *  @return   string
     */
    public function urlEncode($url)
    {
        return strtr(base64_encode($url), '+/=', '-_,');
    }
    

Tak, nazewnictwo jest niespójne. Gdy wszystkie te nazwy metod zostały zgodnie ze schematem somethingEscape(), ale potem ktoś zdecydował się potępiać htmlEscape()i urlEscape()przyjęciem nowych metod i zapomniał o quoteEscape()a jsQuoteEscape().

Fabian Schmengler
źródło
jsQuoteEscape czy to naprawdę bezpieczne? Wygląda na to, że str_replace ($ quote, '\\'. $ Quote, ...) nie działa ... gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax
@Xorax bardzo dobry punkt. Zaktualizuję odpowiedź.
Fabian Schmengler
21

Po prostu to przetłumacz

Zawsze powinieneś używać standardowej funkcji tłumaczenia

W wystąpieniu bloku

<?php echo $this->__('Text goes here'); ?>

Gdziekolwiek indziej

<?php echo Mage::helper('core')->__('Text goes here'); ?>

I używaj go w taki sam sposób, jak sprintfw PHP

Na przykład.

<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>

Lub uciec

W wystąpieniu bloku

<?php echo $this->escapeHtml('HTML goes here'); ?>

Gdziekolwiek indziej

Za pomocą Mage/Core/Helper/Abstract.php

escapeHtml($data, $allowedTags = null)

Na przykład.

<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Ben Lessani - Sonassi
źródło
Ważna uwaga: Mage_Core_Block_Abstract::htmlEscape()jest przestarzała od Magento v 1.4.0.0-rc1 i Mage_Core_Block_Abstract::escapeHtml()powinna być używana zamiast tego.
barell
5
Kolejna ważna uwaga: Tłumaczenie niczego nie umknie . Wypróbuj: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler
3

Klasy Mage_Core_Block_Abstracti Mage_Core_Helper_Abstractobie używają tej samej funkcji, Mage_Core_Helper_Abstract::escapeHtmla jej implementacja wykorzystuje wewnętrznie funkcję PHP htmlspecialchars oprócz implementacji dodatkowej logiki dla tablic z zawartością HTML.

Dostęp do funkcji można uzyskać we wszystkich klasach bloków i pomocników za pomocą $ this, a ponieważ funkcja jest publiczna, można jej używać za pośrednictwem Mage :: helper ('core') lub innej klasy pomocniczej, gdziekolwiek indziej.

Domen Vrankar
źródło
-1

W przypadku konwersji hiszpańskiej:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
jruzafa
źródło