Sono consapevole che Magento 2 ha diversi metodi disponibili per proteggere il modello:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Ma mi chiedo quando utilizzare ciascuno di questi metodi?
Sono consapevole che Magento 2 ha diversi metodi disponibili per proteggere il modello:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Ma mi chiedo quando utilizzare ciascuno di questi metodi?
Risposte:
I metodi di escape in AbstractBlock
tutte le chiamate delegate a Magento\Framework\Escaper
, quindi troverai una panoramica lì.
Diamo un'occhiata ai metodi pubblici e alla loro documentazione:
/**
* 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)
Questo dovrebbe essere il metodo di escape predefinito per qualsiasi output. La convenzione è che il risultato di tutti i metodi che non contengono "HTML" deve essere sfuggito.
( dal 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)
Usalo per evitare l'output all'interno di un attributo HTML, ad esempio
title="<?php echo $block->escapeHtmlAttr($title) ?>"
Sfuggirà all'HTML, ma citerà anche ( "
)
Per impostazione predefinita, sfuggirà anche alle virgolette singole, quindi funziona anche:
onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"
Impostare il secondo parametro su false se non si desidera.
/**
* Escape URL
*
* @param string $string
* @return string
*/
public function escapeUrl($string)
Questo può essere usato per generare URL. Si applicherà le rimuove HTML predefinito fuggire e in aggiunta javascript:
, vbscript:
e data:
. Se si desidera impedire URL come questo nei collegamenti forniti dall'utente, è possibile utilizzare il metodo
Fino a Magento 2.1 questa funzione non era inclusa e escapeXssInUrl()
invece era necessario utilizzarla . Non c'era motivo di usare escapeUrl()
affatto.
Altrimenti, basta usare $block->escapeHtmlAttr()
per gli URL.
( dal Magento 2.2 )
/**
* Encode URL
*
* @param string $string
* @return string
*/
public function encodeUrlParam($string)
Questo applica la codifica URL ai parametri. Per gli URL interni dovresti sempre usare getUrl()
, dove la codifica URL è già fatta per te, quindi questo è necessario solo se costruisci manualmente un URL esterno.
( dal Magento 2.2 )
/**
* Escape string for the JavaScript context
*
* @param string $string
* @return string
*/
public function escapeJs($string)
Codifica caratteri unicode per JavaScript, ad esempio ♥
diventa \u2665
. Usalo per sfuggire all'output all'interno di una stringa JS . Per Javascript inline (ovvero onclick
attributi), è comunque necessario chiamare escapeHtmlAttr()
.
Nota che se lo usi json_encode()
, fa già lo stesso escape, in questo caso escapeJs()
non deve essere usato.
( dal Magento 2.2 )
/**
* Escape string for the CSS context
*
* @param string $string
* @return string
*/
public function escapeCss($string)
Codifica i caratteri unicode per CSS (vedi escapeJs()
), ad esempio da utilizzare nell'attributo content
CSS.
escapeHtmlAttr()
inveceescapeUrl()
inveceescapeHtmlAttr()
inveceescapeHtmlAttr
e escapeHtmlAttr
non esiste in 2.1.2 ... almeno non /vendor/magento/framework/Escaper.php
se non l'hanno aggiunto in seguito e hanno ricodificato il magento ..
Questo è per Magento 2.0. Per 2.1, consultare la risposta di Fabian
escapeHtml
Utilizzare questa funzione nel caso di un output di stringa che non dovrebbe contenere HTML.
Esempio:
<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>
escapeQuote
Utilizzare questa funzione nel caso di attributi HTML
Esempio:
<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>
escapeUrl
Utilizzare questa funzione in caso di output di un URL (senza prevenzione XSS - solo conversione di caratteri)
Esempio:
<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>
escapeXssInUrl
Utilizzare questa funzione in caso di output di un URL (con prevenzione XSS - inclusa la conversazione di caratteri)
Esempio:
<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>
count()
(esempio echo (int)$var
)echo 'test'
)echo "test"
)__
metodoQuesto è usato a fini di traduzione. Usalo quando sai che una stringa può essere tradotta.
Per esempio:
<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
__()
? Sono un po 'stanco di incollare /* @escapeNotVerified */
ovunque: /
__
non è per motivi di sicurezza ma per scopi di traduzione
echo $this->escapeHtml(__('Text to translate'))