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?
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?
Metode melarikan diri di AbstractBlock
semua panggilan delegasi ke Magento\Framework\Escaper
, sehingga Anda akan menemukan ikhtisar di sana.
Mari kita lihat metode publik dan dokumentasinya:
/**
* 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.
( 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.
/**
* 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.
( 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.
( 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 onclick
atribut), 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.
( 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 content
atribut CSS.
escapeHtmlAttr()
sajaescapeUrl()
sajaescapeHtmlAttr()
saja
escapeHtmlAttr
danescapeHtmlAttr
tidak ada di 2.1.2 ... setidaknya tidak di/vendor/magento/framework/Escaper.php
kecuali mereka telah menambahkannya nanti dan memberi tag ulang magento ..Ini untuk Magento 2.0. Untuk 2.1, lihat jawaban Fabian
escapeHtml
Gunakan fungsi ini untuk output string yang seharusnya tidak mengandung HTML.
Contoh:
escapeQuote
Gunakan fungsi ini untuk atribut HTML
Contoh:
escapeUrl
Gunakan fungsi ini jika output URL (tanpa pencegahan XSS - hanya konversi karakter)
Contoh:
escapeXssInUrl
Gunakan fungsi ini jika ada output URL (dengan pencegahan XSS - termasuk percakapan karakter)
Contoh:
Apa yang tidak perlu melarikan diri?
count()
(contohecho (int)$var
)echo 'test'
)echo "test"
)The
__
metodeYang ini digunakan untuk tujuan terjemahan. Gunakan ketika Anda tahu string dapat diterjemahkan.
Sebagai contoh:
sumber
__()
juga? Saya agak lelah menempel di/* @escapeNotVerified */
mana-mana: /__
bukan untuk tujuan keamanan tetapi untuk tujuan terjemahanecho $this->escapeHtml(__('Text to translate'))