Magento 2: şablon güvenliği: hangi yöntemi kullanmalı?


29

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:


35

AbstractBlockTü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:

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)

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.

escapeHtmlAttr ()

( 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.

escapeUrl ()

/**
 * 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 .

encodeUrlParam ()

( 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.

escapeJs ()

( 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, onclicknitelikler) 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.

escapeCss ()

( 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, contentCSS özniteliğinde kullanılmak üzere) .

Kaldırılan yöntemler (Magento 2.2'den itibaren):

  • escapeJsQuote: escapeHtmlAttr()Bunun yerine kullanın
  • escapeXssInUrl: escapeUrl()Bunun yerine kullanın
  • escapeQuote: escapeHtmlAttr()Bunun yerine kullanın

1
İyi iş 2.1 kullanırken sizinkine atıf yapmak için cevabımı küçük bir not ekledim. İlginçtir, Magento U da sadece cevabımda bahsettiğim yöntemlerden bahseder. Kursun sadece 2.0 olduğunu tahmin ediyorum
Digital Pianism'deki Raphael

escapeHtmlAttrve escapeHtmlAttr2.1.2'de mevcut değil ... en azından /vendor/magento/framework/Escaper.phpsonradan
ekleyip magento'yu

2
İyi yakalayış, cevabım aslında en son gelişen şubeye dayanıyordu. Devdocs'a göre, diğer yöntemler 2.2
Fabian Schmengler

İçinde bir img etiketi olması gerekebilecek, isteğe bağlı bir html yığınını temizlemek için kullanılabilecek bir yöntem var mı?
Corgalore,

Hangi anlamda temiz?
Fabian Schmengler

14

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>

Kaçmaya gerek yok mu?

  • Döküm ve php fonksiyonu yazın count()(örnek echo (int)$var)
  • Tek tırnak şeklinde çıktı (örnek echo 'test')
  • Değişkenler olmadan çift tırnak şeklinde çıktı (örnek echo "test")

__yöntem

Bu ç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>

iyi iş .. rapheal
Amit Bera

1
Her çeviriden __()de kaçmalı mıyız ? Her /* @escapeNotVerified */yere yapıştırmaktan biraz yoruldum : /
igloczek

@BartekIgielski güncellenmiş cevabımı gör. __güvenlik amaçlı değil, çeviri amaçlıdır
Digital Pianism'deki Raphael,

1
Ayrıca tercüme edilmiş karakterlerden kaçmayı tavsiye ederim,echo $this->escapeHtml(__('Text to translate'))
KAndy

2
Şu anda devdocs sayfasında bazı yöntemlerin 2.2 ile kullanımdan kaldırılacağına dair bir not var. Şablon güvenlik sayfasını tekrar kontrol ettiğinizden emin olun. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.