Magento 2には、テンプレートを保護するためのいくつかの方法があります。
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
しかし、私はこれらの方法のそれぞれをいつ使用するのだろうと思っていますか?
Magento 2には、テンプレートを保護するためのいくつかの方法があります。
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
しかし、私はこれらの方法のそれぞれをいつ使用するのだろうと思っていますか?
回答:
のAbstractBlock
すべてのデリゲート呼び出しのエスケープメソッドはMagento\Framework\Escaper
、そこで概要を見つけることができます。
パブリックメソッドとそのドキュメントを見てみましょう。
/**
* 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」を含まないすべてのメソッドの結果はエスケープする必要があります。
(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に設定します。
/**
* 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に使用します。
(Magento 2.2以降)
/**
* Encode URL
*
* @param string $string
* @return string
*/
public function encodeUrlParam($string)
これにより、URLエンコードがパラメーターに適用されます。内部URLの場合getUrl()
、常にURLエンコードが既に行われているを使用する必要があります。したがって、これは外部URLを手動で構築する場合にのみ必要です。
(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()
。この場合は使用しないでください。
(Magento 2.2以降)
/**
* Escape string for the CSS context
*
* @param string $string
* @return string
*/
public function escapeCss($string)
CSS属性(escapeJs()
たとえば、content
CSS属性で使用される)のUnicode文字をエンコードします(を参照)。
escapeHtmlAttr()
代わりに使用escapeUrl()
代わりに使用escapeHtmlAttr()
代わりに使用escapeHtmlAttr
およびescapeHtmlAttr
2.1.2には存在しません...少なくともないで/vendor/magento/framework/Escaper.php
、彼らはそれを後で追加し、再タグ付けされたMagentoのしていない限り...
これは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>
count()
(例echo (int)$var
)echo 'test'
)echo "test"
)__
方法これは翻訳の目的で使用されます。文字列を翻訳できることがわかっている場合に使用します。
例えば:
<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
__()
もエスケープする必要がありますか?私は/* @escapeNotVerified */
どこにでも貼り付けるのに少しうんざりしている:/
__
セキュリティ目的ではなく、翻訳目的です
echo $this->escapeHtml(__('Text to translate'))