Magento 2: keamanan templat: metode mana yang digunakan?

29

Saya sadar Magento 2 memiliki beberapa metode yang tersedia untuk mengamankan templat:

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

Tapi saya bertanya-tanya kapan harus menggunakan masing-masing metode?

Raphael di Digital Pianism
sumber

Jawaban:

35

Metode melarikan diri di AbstractBlocksemua panggilan delegasi ke Magento\Framework\Escaper, sehingga Anda akan menemukan ikhtisar di sana.

Mari kita lihat metode publik dan dokumentasinya:

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)

Ini harus menjadi metode pelolosan default Anda untuk output apa pun. Konvensi adalah bahwa hasil dari semua metode yang tidak mengandung "Html" harus diloloskan.

escapeHtmlAttr ()

( sejak 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)

Gunakan ini untuk menghindari output dalam atribut HTML, misalnya

title="<?php echo $block->escapeHtmlAttr($title) ?>"

Ini akan keluar dari HTML, tetapi juga mengutip ( ")

Secara default, ini juga akan keluar dari tanda kutip tunggal, jadi ini juga berfungsi:

onclick="alert('<?php echo $block->escapeHtmlAttr($message) ?>')"

Tetapkan parameter kedua ke false jika ini tidak diinginkan.

escapeUrl ()

/**
 * Escape URL
 *
 * @param string $string
 * @return string
 */
public function escapeUrl($string)

Ini dapat digunakan untuk menampilkan URL. Ini akan menerapkan pelolosan HTML default dan juga menghapus javascript:, vbscript:dan data:. Jika Anda ingin mencegah URL seperti ini di tautan yang disediakan pengguna, Anda dapat menggunakan metode ini.

Sampai Magento 2.1 fitur ini tidak dimasukkan dan Anda harus menggunakannya escapeXssInUrl()sebagai gantinya. Tidak ada alasan untuk menggunakannya escapeUrl()sama sekali.

Jika tidak, cukup gunakan $block->escapeHtmlAttr()untuk URL.

encodeUrlParam ()

( sejak Magento 2.2 )

/**
 * Encode URL
 *
 * @param string $string
 * @return string
 */
public function encodeUrlParam($string)

Ini berlaku pengodean URL ke parameter. Untuk URL internal Anda harus selalu menggunakan getUrl(), di mana penyandian URL sudah dilakukan untuk Anda, jadi ini hanya diperlukan jika Anda membuat URL eksternal secara manual.

escapeJs ()

( sejak Magento 2.2 )

/**
 * Escape string for the JavaScript context
 *
 * @param string $string
 * @return string
 */
public function escapeJs($string)

Mengkodekan karakter unicode untuk JavaScript, misalnya menjadi \u2665. Gunakan untuk menghindari output dalam string JS . Untuk Javascript sebaris (yaitu onclickatribut), Anda masih perlu menelepon escapeHtmlAttr().

Perhatikan bahwa jika Anda menggunakan json_encode(), itu sudah melakukan pelarian yang sama, dalam hal ini, escapeJs()tidak boleh digunakan.

escapeCss ()

( sejak Magento 2.2 )

/**
 * Escape string for the CSS context
 *
 * @param string $string
 * @return string
 */
public function escapeCss($string)

Mengkodekan karakter unicode untuk CSS (lihat escapeJs()), misalnya untuk digunakan dalam contentatribut CSS.

Metode usang (per Magento 2.2):

  • escapeJsQuote: Gunakan escapeHtmlAttr()saja
  • escapeXssInUrl: Gunakan escapeUrl()saja
  • escapeQuote: Gunakan escapeHtmlAttr()saja
Fabian Schmengler
sumber
1
Pekerjaan bagus Saya telah menambahkan sedikit catatan pada jawaban saya untuk merujuk pada jawaban Anda saat menggunakan 2.1. Menariknya, Magento U couse hanya menyebutkan metode yang saya sebutkan dalam jawaban saya. Saya kira kursusnya hanya 2,0
Raphael di Digital Pianism
escapeHtmlAttrdan escapeHtmlAttrtidak ada di 2.1.2 ... setidaknya tidak di /vendor/magento/framework/Escaper.phpkecuali mereka telah menambahkannya nanti dan memberi tag ulang magento ..
OZZIE
2
Tangkapan bagus, jawaban saya sebenarnya didasarkan pada pengembangan cabang terbaru. Menurut devdocs, metode lain akan
dicabut
Apakah ada metode yang dapat digunakan untuk membersihkan sepotong html sewenang-wenang yang mungkin perlu memiliki tag img di dalamnya?
Corgalore
Bersihkan dalam arti apa?
Fabian Schmengler
14

Ini untuk Magento 2.0. Untuk 2.1, lihat jawaban Fabian

escapeHtml

Gunakan fungsi ini untuk output string yang seharusnya tidak mengandung HTML.

Contoh:

<span class='label'><?php echo $block->escapeHtml($block->getLabel()); ?></span>

escapeQuote

Gunakan fungsi ini untuk atribut HTML

Contoh:

<span class="<?php echo $block->escapeQuote($block->getSpanClass()); ?>">Description</span>

escapeUrl

Gunakan fungsi ini jika output URL (tanpa pencegahan XSS - hanya konversi karakter)

Contoh:

<a href="<?php echo $block->escapeUrl($block->getUrl()); ?>">Link</a>

escapeXssInUrl

Gunakan fungsi ini jika ada output URL (dengan pencegahan XSS - termasuk percakapan karakter)

Contoh:

<a href="<?php echo $block->escapeXssInUrl($block->getUrl()); ?>">Link</a>

Apa yang tidak perlu melarikan diri?

  • Ketik casting dan fungsi php count()(contoh echo (int)$var)
  • Output dalam tanda kutip tunggal (contoh echo 'test')
  • Output dalam tanda kutip ganda tanpa variabel (contoh echo "test")

The __metode

Yang ini digunakan untuk tujuan terjemahan. Gunakan ketika Anda tahu string dapat diterjemahkan.

Sebagai contoh:

<caption class="table-caption"><?php /* @escapeNotVerified */ echo __('More Information') ?></caption>
Raphael di Digital Pianism
sumber
kerja bagus .. rapheal
Amit Bera
1
Haruskah kita luput dari setiap terjemahan __()juga? Saya agak lelah menempel di /* @escapeNotVerified */mana-mana: /
igloczek
@BartekIgielski lihat jawaban saya yang diperbarui. __bukan untuk tujuan keamanan tetapi untuk tujuan terjemahan
Raphael di Digital Pianism
1
Saya juga merekomendasikan untuk menghindari string yang diterjemahkan, sepertiecho $this->escapeHtml(__('Text to translate'))
KAndy
2
Saat ini ada catatan di halaman devdocs bahwa beberapa metode akan ditinggalkan dengan 2.2. Pastikan untuk memeriksa kembali pada halaman keamanan templat. devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/…
Anna Völkl