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.