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.