Magento 2:テンプレートセキュリティ:使用する方法


29

Magento 2には、テンプレートを保護するためのいくつかの方法があります。

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

しかし、私はこれらの方法のそれぞれをいつ使用するのだろうと思っていますか?

回答:


35

AbstractBlockすべてのデリゲート呼び出しのエスケープメソッドはMagento\Framework\Escaper、そこで概要を見つけることができます。

パブリックメソッドとそのドキュメントを見てみましょう。

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)

これは、出力のデフォルトのエスケープ方法である必要があります。慣習では、「Html」を含まないすべてのメソッドの結果はエスケープする必要があります。

escapeHtmlAttr()

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)

これを使用して、HTML属性内の出力をエスケープします。たとえば、

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

HTMLをエスケープしますが、引用符も使用します("

デフォルトでは、単一引用符もエスケープするため、これも機能します。

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

これが望ましくない場合は、2番目のパラメーターをfalseに設定します。

escapeUrl()

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

これは、URLを出力するために使用できます。これは、デフォルトのHTMLをエスケープし、さらに削除が適用されますjavascript:vbscript:data:。ユーザーが提供するリンクでこのようなURLを防止する場合は、メソッドを使用できます。

Magento 2.1までは、この機能は含まれておらず、escapeXssInUrl()代わりに使用する必要がありました。使用する理由はまったくありませんでしたescapeUrl()

それ以外の場合は、単に$block->escapeHtmlAttr()URLに使用します。

encodeUrlParam()

Magento 2.2以降

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

これにより、URLエンコードがパラメーターに適用されます。内部URLの場合getUrl()、常にURLエンコードが既に行われているを使用する必要があります。したがって、これは外部URLを手動で構築する場合にのみ必要です。

escapeJs()

Magento 2.2以降

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

JavaScriptのUnicode文字をエンコードします。たとえば、になり\u2665ます。これを使用して、JS文字列内の出力をエスケープします。インラインJavascript(つまりonclick属性)については、まだ呼び出す必要がありますescapeHtmlAttr()

を使用する場合json_encode()、同じエスケープを既に実行していることに注意してくださいescapeJs()。この場合は使用しないでください。

escapeCss()

Magento 2.2以降

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

CSS属性(escapeJs()たとえば、contentCSS属性で使用される)のUnicode文字をエンコードします(を参照)。

非推奨のメソッド(Magento 2.2以降):

  • escapeJsQuote:escapeHtmlAttr()代わりに使用
  • escapeXssInUrl:escapeUrl()代わりに使用
  • escapeQuote:escapeHtmlAttr()代わりに使用

1
良い仕事2.1を使用するときにあなたのものを参照するために、私の答えに小さなメモを追加しました。興味深いことに、Magento Uコースは、私の回答で言及した方法のみに言及しています。コースは2.0のみだと思います
デジタルピアニズムのラファエル

escapeHtmlAttrおよびescapeHtmlAttr2.1.2には存在しません...少なくともないで/vendor/magento/framework/Escaper.php、彼らはそれを後で追加し、再タグ付けされたMagentoのしていない限り...
オジー

2
良いキャッチ、私の答えは実際には最新の開発ブランチに基づいていました。devdocsによると、他のメソッドは2.2から非推奨になります
ファビアンシュメングラー

imgタグを必要とする可能性があるHTMLの任意のチャンクをクリーニングするために使用できるメソッドはありますか?
コーガロール

どの意味できれいですか?
ファビアンシュメングラー

14

これはMagento 2.0用です。2.1については、ファビアンの答えを参照してください

escapeHtml

HTMLを含むべきではない文字列出力の場合に、この関数を使用します。

例:

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

escapeQuote

HTML属性の場合にこの関数を使用します

例:

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

escapeUrl

URL出力の場合にこの機能を使用します(XSS防止なし-文字変換のみ)

例:

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

escapeXssInUrl

URL出力の場合にこの機能を使用します(XSS防止-文字会話を含む)

例:

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

エスケープする必要がないものは何ですか?

  • 型キャストとphp関数count()(例echo (int)$var
  • 単一引用符での出力(例echo 'test'
  • 変数なしの二重引用符での出力(例echo "test"

__方法

これは翻訳の目的で使用されます。文字列を翻訳できることがわかっている場合に使用します。

例えば:

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

良い仕事.. rapheal
アミットベラ

1
すべての翻訳__()もエスケープする必要がありますか?私は/* @escapeNotVerified */どこにでも貼り付けるのに少しうんざりしている:/
イグロチェク

@BartekIgielskiは私の更新された答えを見る。__セキュリティ目的ではなく、翻訳目的です
デジタルピアニズムのラファエル

1
また、翻訳された文字列をエスケープすることをお勧めしますecho $this->escapeHtml(__('Text to translate'))
-KAndy

2
現在、devdocsページには、一部のメソッドが2.2で非推奨になるというメモがあります。テンプレートのセキュリティページでもう一度確認してください。devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/...
アンナ・フォルクル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.