Magento 2:模板安全性:使用哪种方法?


29

我知道Magento 2有几种方法可以保护模板:

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

但是我想知道何时使用这些方法中的每一个?

Answers:


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) ?>')"

如果不需要,请将第二个参数设置为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的unicode字符(请参阅参考资料escapeJs()),例如在contentCSS属性中使用。

不推荐使用的方法(从Magento 2.2开始):

  • escapeJsQuote:escapeHtmlAttr()改用
  • escapeXssInUrl:escapeUrl()改用
  • escapeQuote:escapeHtmlAttr()改用

1
做得好,我在回答中添加了一点注释,以供您在使用2.1时参考。有趣的是,Magento U仅仅提及了我在答案中提到的方法。我猜这门课程仅是2.0
Raphael在Digital Pianism上

escapeHtmlAttrescapeHtmlAttr在2.1.2中不存在...至少在/vendor/magento/framework/Escaper.php以后没有添加,并重新标记magento
才存在。.– OZZIE

2
很好,我的答案实际上是基于最新的develop分支。按照devdocs,其他的方法将被从2.2弃用
费边Schmengler

有没有一种方法可以用来清除可能需要带有img标记的html的任意块?
Corgalore

清洁在哪个意义上?
Fabian Schmengler,

14

这是针对Magento 2.0的。对于2.1,请参考Fabian的答案

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 */各处有点累:/
igloczek

@BartekIgielski看到我更新的答案。__并非出于安全目的,而是出于翻译目的
拉斐尔(Raphael)在Digital Pianism上的发布日期:

1
我也建议转义翻译后的字符串,例如echo $this->escapeHtml(__('Text to translate'))
KAndy

2
目前在devdocs页面上有一条注释,其中某些方法将在2.2中弃用。确保再次检查模板安全性页面。devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/...
安娜Völkl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.