Magento 2: Template-Sicherheit: Welche Methode soll verwendet werden?

29

Mir ist bekannt, dass Magento 2 verschiedene Methoden zum Sichern der Vorlage bietet:

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

Aber ich frage mich, wann ich diese Methoden anwenden soll?

Raphael beim digitalen Pianismus
quelle

Antworten:

35

Die Escaping-Methoden in AbstractBlockallen Delegate-Aufrufen an Magento\Framework\Escaper, sodass Sie dort eine Übersicht finden.

Schauen wir uns die öffentlichen Methoden und ihre Dokumentation an:

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)

Dies sollte Ihre Standard-Escape-Methode für jede Ausgabe sein. Konvention ist, dass das Ergebnis aller Methoden, die nicht "Html" enthalten, maskiert werden muss.

escapeHtmlAttr ()

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

Verwenden Sie diese Option, um beispielsweise die Ausgabe in einem HTML-Attribut zu umgehen

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

Es wird HTML entkommen, aber auch Anführungszeichen ( ")

Standardmäßig werden auch einfache Anführungszeichen ignoriert, sodass dies auch funktioniert:

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

Setzen Sie den zweiten Parameter auf false, wenn dies nicht gewünscht ist.

escapeUrl ()

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

Dies kann zur Ausgabe von URLs verwendet werden. Es wird die Standard - HTML - escaping und zusätzlich entfernt gelten javascript:, vbscript:und data:. Wenn Sie URLs wie diese in von Benutzern bereitgestellten Links verhindern möchten, können Sie die Methode verwenden.

Bis zu Magento 2.1 war diese Funktion nicht enthalten und Sie mussten escapeXssInUrl()stattdessen verwenden. Es gab keinen Grund, etwas zu benutzen escapeUrl().

Ansonsten einfach $block->escapeHtmlAttr()für URLs verwenden.

encodeUrlParam ()

( seit Magento 2.2 )

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

Dies wendet die URL-Codierung auf Parameter an. Für interne URLs sollten Sie immer verwenden getUrl(), wenn die URL-Codierung bereits für Sie durchgeführt wurde. Dies ist also nur erforderlich, wenn Sie manuell eine externe URL erstellen.

EscapeJs ()

( seit Magento 2.2 )

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

Codiert Unicode - Zeichen für JavaScript, beispielsweise wird \u2665. Verwenden Sie diese Option, um die Ausgabe innerhalb eines JS-Strings zu verlassen . Für Inline-Javascript (dh onclickAttribute) müssen Sie immer noch anrufen escapeHtmlAttr().

Beachten Sie json_encode(), dass es in diesem Fall escapeJs()nicht verwendet werden darf , wenn Sie es verwenden.

escapeCss ()

( seit Magento 2.2 )

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

Codiert Unicode-Zeichen für CSS (siehe escapeJs()), die beispielsweise im contentCSS-Attribut verwendet werden sollen.

Veraltete Methoden (ab Magento 2.2):

  • escapeJsQuote: Verwenden Sie escapeHtmlAttr()stattdessen
  • escapeXssInUrl: Verwenden Sie escapeUrl()stattdessen
  • escapeQuote: Verwenden Sie escapeHtmlAttr()stattdessen
Fabian Schmengler
quelle
1
Gute Arbeit Ich habe meiner Antwort eine kleine Notiz hinzugefügt, um mich bei der Verwendung von 2.1 auf Ihre zu beziehen. Interessanterweise erwähnt das Magento U nur die Methoden, die ich in meiner Antwort erwähnt habe. Ich denke, der Kurs ist nur 2.0
Raphael beim Digital Pianism
escapeHtmlAttrund escapeHtmlAttrexistiert nicht in 2.1.2 ... zumindest nicht in, es /vendor/magento/framework/Escaper.phpsei denn, sie haben es später hinzugefügt und Magento neu getaggt ..
OZZIE
2
Guter Fang, meine Antwort basierte eigentlich auf dem neuesten Entwicklungszweig. Laut den Devdocs werden die anderen Methoden von 2.2
Fabian Schmengler
Gibt es eine Methode, die verwendet werden kann, um einen beliebigen Teil von HTML zu bereinigen, für den möglicherweise ein img-Tag erforderlich ist?
Corgalore
Sauber in welchem ​​Sinne?
Fabian Schmengler
14

Dies ist für Magento 2.0. Für 2.1 siehe Fabians Antwort

escapeHtml

Verwenden Sie diese Funktion bei einer String-Ausgabe, die kein HTML enthalten soll.

Beispiel:

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

escapeQuote

Verwenden Sie diese Funktion bei HTML-Attributen

Beispiel:

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

escapeUrl

Verwenden Sie diese Funktion bei einer URL-Ausgabe (ohne XSS-Schutz - nur Zeichenkonvertierung)

Beispiel:

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

escapeXssInUrl

Verwenden Sie diese Funktion bei einer URL-Ausgabe (mit XSS-Schutz - einschließlich Zeichenkonversation)

Beispiel:

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

Was braucht man nicht zu entkommen?

  • Typ Casting und PHP-Funktion count()(Beispiel echo (int)$var)
  • Ausgabe in einfachen Anführungszeichen (Beispiel echo 'test')
  • Ausgabe in doppelten Anführungszeichen ohne Variablen (Beispiel echo "test")

Die __Methode

Dieser wird für Übersetzungszwecke verwendet. Verwenden Sie diese Option, wenn Sie wissen, dass eine Zeichenfolge übersetzt werden kann.

Beispielsweise:

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
Raphael beim digitalen Pianismus
quelle
Gute Arbeit .. Raffael
Amit Bera
1
Sollen wir uns auch jeder Übersetzung entziehen __()? Ich bin es ein bisschen leid /* @escapeNotVerified */überall zu
kleben
@BartekIgielski siehe meine aktualisierte Antwort. __ist nicht für Sicherheitszwecke, sondern für Übersetzungszwecke
Raphael bei Digital Pianism
1
Außerdem empfehle ich, übersetzte Zeichenfolgen wieecho $this->escapeHtml(__('Text to translate'))
KAndy
2
Derzeit gibt es auf der devdocs-Seite einen Hinweis, dass einige Methoden mit 2.2 nicht mehr unterstützt werden. Stellen Sie sicher, dass Sie die Sicherheitsseite der Vorlage erneut aufrufen. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl