Magento 2: template security: quale metodo usare?


29

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:


35

I metodi di escape in AbstractBlocktutte le chiamate delegate a Magento\Framework\Escaper, quindi troverai una panoramica lì.

Diamo un'occhiata ai metodi pubblici e alla loro documentazione:

escapeHTML ()

/**
 * 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.

escapeHtmlAttr ()

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

escapeUrl ()

/**
 * 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.

encodeUrlParam ()

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

escapeJs ()

( 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 onclickattributi), è comunque necessario chiamare escapeHtmlAttr().

Nota che se lo usi json_encode(), fa già lo stesso escape, in questo caso escapeJs()non deve essere usato.

escapeCss ()

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

Metodi obsoleti (a partire da Magento 2.2):

  • escapeJsQuote: utilizzare escapeHtmlAttr()invece
  • escapeXssInUrl: utilizzare escapeUrl()invece
  • escapeQuote: utilizzare escapeHtmlAttr()invece

1
Ottimo lavoro Ho aggiunto una piccola nota alla mia risposta per fare riferimento alla tua quando utilizzo 2.1. È interessante notare che Magento U couse menziona solo i metodi che ho citato nella mia risposta. Immagino che il corso sia solo 2.0
Raffaello al Pianismo digitale il

escapeHtmlAttre escapeHtmlAttrnon esiste in 2.1.2 ... almeno non /vendor/magento/framework/Escaper.phpse non l'hanno aggiunto in seguito e hanno ricodificato il magento ..
OZZIE

2
Buona cattura, la mia risposta in realtà era basata sull'ultimo ramo di sviluppo. Secondo devdocs, gli altri metodi saranno deprecati da 2.2
Fabian Schmengler,

Esiste un metodo che può essere utilizzato per pulire un pezzo arbitrario di HTML che potrebbe aver bisogno di avere un tag img in esso?
Corgalore,

Pulito in che senso?
Fabian Schmengler,

14

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>

Cosa non ha bisogno di scappare?

  • Digitare casting e funzione php count()(esempio echo (int)$var)
  • Output tra virgolette singole (esempio echo 'test')
  • Output tra virgolette senza variabili (esempio echo "test")

Il __metodo

Questo è 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>

buon lavoro .. rapheal
Amit Bera

1
Dovremmo sfuggire anche ad ogni traduzione __()? Sono un po 'stanco di incollare /* @escapeNotVerified */ovunque: /
igloczek

@BartekIgielski vedi la mia risposta aggiornata. __non è per motivi di sicurezza ma per scopi di traduzione
Raffaello al Pianismo digitale il

1
Consiglio anche di sfuggire alle stringhe tradotte, comeecho $this->escapeHtml(__('Text to translate'))
KAndy,

2
C'è attualmente una nota sulla pagina devdocs che alcuni metodi saranno deprecati con 2.2. Assicurati di ricontrollare nella pagina di sicurezza del modello. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl
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.