Wiem, że Magento 2 ma kilka metod zabezpieczania szablonu:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Ale zastanawiam się, kiedy użyć każdej z tych metod?
Metody zmiany znaczenia we AbstractBlock
wszystkich wywołaniach delegowanych do Magento\Framework\Escaper
, więc znajdziesz tam przegląd.
Spójrzmy na publiczne metody i ich dokumentację:
/**
* Escape string for HTML context. allowedTags will not be escaped, except the following: script, img, embed,
* iframe, video, source, object, audio
*
* @param string|array $data
* @param array|null $allowedTags
* @return string|array
*/
public function escapeHtml($data, $allowedTags = null)
Powinna to być domyślna metoda zmiany znaczenia dla dowolnego wyniku. Konwencja jest taka, że wynik wszystkich metod, które nie zawierają „HTML”, musi być poprzedzony znakiem ucieczki.
( od Magento 2.2 )
/**
* Escape a string for the HTML attribute context
*
* @param string $string
* @param boolean $escapeSingleQuote
* @return string
*/
public function escapeHtmlAttr($string, $escapeSingleQuote = true)
Użyj tego, aby na przykład uciec danych wyjściowych w atrybucie HTML
title="<?php echo $block->escapeHtmlAttr($title) ?>"
Uniknie HTML, ale także cudzysłowów ( "
)
Domyślnie będzie także unikał pojedynczych cudzysłowów, więc to też działa:
onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"
Ustaw drugi parametr na false, jeśli nie jest to pożądane.
/**
* Escape URL
*
* @param string $string
* @return string
*/
public function escapeUrl($string)
Może to służyć do generowania adresów URL. Zastosuje domyślną zmianę znaczenia HTML i dodatkowo usunie javascript:
, vbscript:
i data:
. Jeśli chcesz zapobiec takim adresom URL w linkach podanych przez użytkownika, możesz użyć tej metody.
Do Magento 2.1 ta funkcja nie była dołączana i trzeba było z niej korzystać escapeXssInUrl()
. Nie było żadnego powodu, by z niego korzystać escapeUrl()
.
W przeciwnym razie użyj tylko $block->escapeHtmlAttr()
dla adresów URL.
( od Magento 2.2 )
/**
* Encode URL
*
* @param string $string
* @return string
*/
public function encodeUrlParam($string)
Dotyczy to kodowania adresów URL do parametrów. W przypadku wewnętrznych adresów URL należy zawsze używać getUrl()
, gdy kodowanie adresów URL jest już dla Ciebie wykonane, więc jest to konieczne tylko wtedy, gdy ręcznie konstruujesz zewnętrzny adres URL.
( od Magento 2.2 )
/**
* Escape string for the JavaScript context
*
* @param string $string
* @return string
*/
public function escapeJs($string)
Koduje znaki Unicode język JavaScript, np ♥
staje \u2665
. Użyj go do zmiany wyniku w ciągu JS . W przypadku wbudowanego Javascript (tj. onclick
Atrybutów) nadal trzeba wywoływać escapeHtmlAttr()
.
Zauważ, że jeśli używasz json_encode()
, robi to samo, ale w tym przypadku escapeJs()
nie można go użyć.
( od Magento 2.2 )
/**
* Escape string for the CSS context
*
* @param string $string
* @return string
*/
public function escapeCss($string)
Koduje znaki Unicode dla CSS (patrz escapeJs()
), na przykład do użycia w content
atrybucie CSS.
escapeHtmlAttr()
zamiast tegoescapeUrl()
zamiast tegoescapeHtmlAttr()
zamiast tego
escapeHtmlAttr
iescapeHtmlAttr
nie istnieje w 2.1.2 ... przynajmniej nie w,/vendor/magento/framework/Escaper.php
chyba że dodali go później i ponownieTo dotyczy Magento 2.0. W przypadku 2.1 zapoznaj się z odpowiedzią Fabiana
escapeHtml
Użyj tej funkcji w przypadku łańcucha wyjściowego, który nie powinien zawierać HTML.
Przykład:
escapeQuote
Użyj tej funkcji w przypadku atrybutów HTML
Przykład:
escapeUrl
Użyj tej funkcji w przypadku wyjścia adresu URL (bez zapobiegania XSS - tylko konwersja znaków)
Przykład:
escapeXssInUrl
Użyj tej funkcji w przypadku wyjścia adresu URL (z zapobieganiem XSS - w tym konwersacji znaków)
Przykład:
Czego nie trzeba uciekać?
count()
(przykładecho (int)$var
)echo 'test'
)echo "test"
)__
metodaTen służy do tłumaczenia. Użyj go, jeśli wiesz, że ciąg może zostać przetłumaczony.
Na przykład:
źródło
__()
? Jestem trochę zmęczony wklejaniem/* @escapeNotVerified */
wszędzie: /__
nie jest przeznaczony do celów bezpieczeństwa, ale do celów tłumaczeniaecho $this->escapeHtml(__('Text to translate'))