Magento 2: sécurité des modèles: quelle méthode utiliser?


29

Je suis conscient que Magento 2 dispose de plusieurs méthodes pour sécuriser le modèle:

  • $block->escapeHtml()
  • $block->escapeQuote()
  • $block->escapeUrl()
  • $block->escapeXssInUrl()

Mais je me demande quand utiliser chacune de ces méthodes?

Réponses:


35

Les méthodes d'échappement dans AbstractBlocktous les appels de délégué à Magento\Framework\Escaper, vous y trouverez donc un aperçu.

Regardons les méthodes publiques et leur documentation:

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)

Cela devrait être votre méthode d'échappement par défaut pour toute sortie. La convention est que le résultat de toutes les méthodes qui ne contiennent pas "Html" doit être échappé.

escapeHtmlAttr ()

( depuis 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)

Utilisez ceci pour échapper la sortie dans un attribut HTML, par exemple

title="<?php echo $block->escapeHtmlAttr($title) ?>"

Il échappera au HTML, mais aussi aux guillemets ( ")

Par défaut, il échappera également aux guillemets simples, donc cela fonctionne aussi:

onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"

Définissez le deuxième paramètre sur false si cela n'est pas souhaité.

escapeUrl ()

/**
 * Escape URL
 *
 * @param string $string
 * @return string
 */
public function escapeUrl($string)

Cela peut être utilisé pour générer des URL. Il appliquera l'échappement HTML par défaut et supprime également javascript:, vbscript:et data:. Si vous souhaitez empêcher des URL comme celle-ci dans les liens fournis par l'utilisateur, vous pouvez utiliser la méthode.

Jusqu'à Magento 2.1, cette fonctionnalité n'était pas incluse et vous deviez l'utiliser à la escapeXssInUrl()place. Il n'y avait aucune raison de l'utiliser escapeUrl().

Sinon, utilisez simplement les $block->escapeHtmlAttr()URL.

encodeUrlParam ()

( depuis Magento 2.2 )

/**
 * Encode URL
 *
 * @param string $string
 * @return string
 */
public function encodeUrlParam($string)

Cela applique le codage URL aux paramètres. Pour les URL internes, vous devez toujours utiliser getUrl(), où l'encodage d'URL est déjà fait pour vous, donc cela n'est nécessaire que si vous construisez manuellement une URL externe.

escapeJs ()

( depuis Magento 2.2 )

/**
 * Escape string for the JavaScript context
 *
 * @param string $string
 * @return string
 */
public function escapeJs($string)

Encode les caractères unicode pour JavaScript, par exemple devient \u2665. Utilisez-le pour échapper la sortie dans une chaîne JS . Pour Javascript en ligne (c'est-à-dire les onclickattributs), vous devez toujours appeler escapeHtmlAttr().

Notez que si vous utilisez json_encode(), il fait déjà le même échappement, dans ce cas, escapeJs()ne doit pas être utilisé.

escapeCss ()

( depuis Magento 2.2 )

/**
 * Escape string for the CSS context
 *
 * @param string $string
 * @return string
 */
public function escapeCss($string)

Encode les caractères unicode pour CSS (voir escapeJs()), par exemple à utiliser dans l' contentattribut CSS.

Méthodes obsolètes (à partir de Magento 2.2):

  • escapeJsQuote: Utilisez à la escapeHtmlAttr()place
  • escapeXssInUrl: utiliser à la escapeUrl()place
  • escapeQuote: Utilisez à la escapeHtmlAttr()place

1
Bon travail, j'ai ajouté une petite note à ma réponse pour faire référence à la vôtre lors de l'utilisation de 2.1. Fait intéressant, le Magento U couse ne mentionne que les méthodes que j'ai mentionnées dans ma réponse. Je suppose que le cours est uniquement 2.0
Raphael au Digital Pianism

escapeHtmlAttret escapeHtmlAttrn'existe pas dans 2.1.2 ... du moins pas à /vendor/magento/framework/Escaper.phpmoins qu'ils ne l'aient ajouté plus tard et ré-étiqueté magento ..
OZZIE

2
Bonne prise, ma réponse était en fait basée sur la dernière branche de développement. Selon les devdocs, les autres méthodes seront dépréciées à partir de la 2.2
Fabian Schmengler

Existe-t-il une méthode qui peut être utilisée pour nettoyer un morceau arbitraire de code HTML qui pourrait avoir besoin d'une balise img?
Corgalore

Propre dans quel sens?
Fabian Schmengler

14

C'est pour Magento 2.0. Pour 2.1, se référer à la réponse de Fabian

escapeHtml

Utilisez cette fonction dans le cas d'une sortie de chaîne qui ne doit pas contenir de HTML.

Exemple:

<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>

escapeQuote

Utilisez cette fonction dans le cas des attributs HTML

Exemple:

<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>

escapeUrl

Utilisez cette fonction en cas de sortie d'URL (sans prévention XSS - uniquement conversion de caractères)

Exemple:

<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>

escapeXssInUrl

Utilisez cette fonction en cas de sortie d'URL (avec prévention XSS - y compris la conversation de caractères)

Exemple:

<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>

Qu'est-ce qui n'a pas besoin de s'échapper?

  • Cast de type et fonction php count()(exemple echo (int)$var)
  • Sortie entre guillemets simples (exemple echo 'test')
  • Sortie entre guillemets doubles sans variables (exemple echo "test")

La __méthode

Celui-ci est utilisé à des fins de traduction. Utilisez-le lorsque vous savez qu'une chaîne peut être traduite.

Par exemple:

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>

bon travail .. rapheal
Amit Bera

1
Faut-il aussi échapper à chaque traduction __()? Je suis un peu fatigué de coller /* @escapeNotVerified */partout: /
igloczek

@BartekIgielski voir ma réponse mise à jour. __n'est pas à des fins de sécurité mais à des fins de traduction
Raphael au Digital Pianism

1
Je recommande également d'échapper aux chaînes traduites, commeecho $this->escapeHtml(__('Text to translate'))
KAndy

2
Il y a actuellement une note sur la page devdocs que certaines méthodes seront obsolètes avec 2.2. Assurez-vous de revenir sur la page de sécurité du modèle. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.