Czy jest wbudowany pomocnik Magento do ucieczki z danych wyjściowych szablonu, aby zapobiec XSS?
A może powinienem po prostu użyć PHP htmlspecialchars
lub htmlentities
funkcji?
Czy jest wbudowany pomocnik Magento do ucieczki z danych wyjściowych szablonu, aby zapobiec XSS?
A może powinienem po prostu użyć PHP htmlspecialchars
lub htmlentities
funkcji?
Odpowiedzi:
Istnieje kilka metod pomocniczych w zależności od kontekstu. Wszystkie są zdefiniowane w, Mage_Core_Helper_Abstract
ale także w Mage_Core_Block_Abstract
, więc możesz używać ich z $this->...()
każdym szablonem:
escapeHtml()
: W rzeczywistości wykorzystuje htmlspecialchars
zalecane 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()
.
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 sprintf
w PHP
Na przykład.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
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'); ?>
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.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Klasy Mage_Core_Block_Abstract
i Mage_Core_Helper_Abstract
obie używają tej samej funkcji, Mage_Core_Helper_Abstract::escapeHtml
a 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.