Magento 2'nin şablonu korumak için kullanabileceği birkaç yöntem olduğunu biliyorum:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Ama bu yöntemlerin ne zaman kullanılacağını merak ediyorum?
Magento 2'nin şablonu korumak için kullanabileceği birkaç yöntem olduğunu biliyorum:
$block->escapeHtml()
$block->escapeQuote()
$block->escapeUrl()
$block->escapeXssInUrl()
Ama bu yöntemlerin ne zaman kullanılacağını merak ediyorum?
Yanıtlar:
AbstractBlock
Tüm temsilcilerden kaçan yöntemler çağrılır Magento\Framework\Escaper
, böylece orada bir genel bakış bulacaksınız.
Genel yöntemlere ve belgelerine bakalım:
/**
* 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)
Bu, herhangi bir çıktı için varsayılan çıkış yönteminiz olmalıdır. Sözleşme, "Html" içermeyen tüm yöntemlerin sonucundan kaçılması gerektiğidir.
( Magento 2.2’den beri )
/**
* Escape a string for the HTML attribute context
*
* @param string $string
* @param boolean $escapeSingleQuote
* @return string
*/
public function escapeHtmlAttr($string, $escapeSingleQuote = true)
Örneğin, bir HTML özniteliğindeki çıktıdan kaçmak için kullanın
title="<?php echo $block->escapeHtmlAttr($title) ?>"
HTML'den kaçacak, aynı zamanda quotes ( "
)
Varsayılan olarak, aynı zamanda tek tırnaktan kaçacaktır, yani bu da işe yarar:
onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"
İstenmiyorsa ikinci parametreyi false olarak ayarlayın.
/**
* Escape URL
*
* @param string $string
* @return string
*/
public function escapeUrl($string)
Bu URL'lerin çıktısını almak için kullanılabilir. Bu varsayılan HTML kaçış ve ek silen uygulayacak javascript:
, vbscript:
ve data:
. Bu gibi URL'leri kullanıcı tarafından sağlanan bağlantılarda önlemek istiyorsanız, yöntemi kullanabilirsiniz.
Magento 2.1'e kadar bu özellik dahil edilmedi ve escapeXssInUrl()
bunun yerine kullanmanız gerekiyordu . Hiç kullanmak escapeUrl()
için hiçbir sebep yoktu .
Aksi takdirde, yalnızca $block->escapeHtmlAttr()
URL’leri kullanın .
( Magento 2.2’den beri )
/**
* Encode URL
*
* @param string $string
* @return string
*/
public function encodeUrlParam($string)
Bu, parametrelere URL kodlaması uygular. Dahili URL'ler için her zaman getUrl()
, URL kodlamanın sizin için yapıldığı yerlerde kullanmalısınız , bu nedenle, yalnızca harici bir URL oluşturduğunuzda bu gereklidir.
( Magento 2.2’den beri )
/**
* Escape string for the JavaScript context
*
* @param string $string
* @return string
*/
public function escapeJs($string)
JavaScript için unicode karakterleri kodlar, örneğin ♥
olur \u2665
. Bir JS dizesindeki çıktıdan kaçmak için kullanın . Satır içi Javascript (yani, onclick
nitelikler) için hala aramanız gerekir escapeHtmlAttr()
.
Kullanmak eğer Not json_encode()
, zaten aynı kaçışa yapar, bu durumda, escapeJs()
kullanılmamalıdır.
( Magento 2.2’den beri )
/**
* Escape string for the CSS context
*
* @param string $string
* @return string
*/
public function escapeCss($string)
CSS için unicode karakterleri kodlar ( escapeJs()
örneğin, content
CSS özniteliğinde kullanılmak üzere) .
escapeHtmlAttr()
Bunun yerine kullanınescapeUrl()
Bunun yerine kullanınescapeHtmlAttr()
Bunun yerine kullanınescapeHtmlAttr
ve escapeHtmlAttr
2.1.2'de mevcut değil ... en azından /vendor/magento/framework/Escaper.php
sonradan
Bu Magento 2.0 içindir. 2.1 için Fabian'ın cevabına bakınız.
escapeHtml
HTML içermemesi gereken bir dizge çıktısı olması durumunda bu işlevi kullanın.
Örnek:
<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>
escapeQuote
HTML özellikleri durumunda bu işlevi kullanın.
Örnek:
<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>
escapeUrl
URL çıktısı olması durumunda bu işlevi kullanın (XSS önleme olmadan - yalnızca karakter dönüşümü)
Örnek:
<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>
escapeXssInUrl
URL çıktısı olması durumunda bu işlevi kullanın (XSS önleme ile - karakter sohbeti dahil)
Örnek:
<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>
count()
(örnek echo (int)$var
)echo 'test'
)echo "test"
)__
yöntemBu çeviri amaçlı kullanılır. Bir dizenin çevrilebileceğini bildiğiniz zaman kullanın.
Örneğin:
<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
__()
de kaçmalı mıyız ? Her /* @escapeNotVerified */
yere yapıştırmaktan biraz yoruldum : /
__
güvenlik amaçlı değil, çeviri amaçlıdır
echo $this->escapeHtml(__('Text to translate'))