Apakah ada pembantu Magento bawaan untuk menghindari data template yang dihasilkan untuk mencegah XSS?
Atau haruskah saya menggunakan PHP htmlspecialchars
atau htmlentities
fungsinya saja?
Apakah ada pembantu Magento bawaan untuk menghindari data template yang dihasilkan untuk mencegah XSS?
Atau haruskah saya menggunakan PHP htmlspecialchars
atau htmlentities
fungsinya saja?
Jawaban:
Ada beberapa metode pembantu tergantung pada konteksnya. Semua didefinisikan Mage_Core_Helper_Abstract
tetapi juga di Mage_Core_Block_Abstract
, sehingga Anda dapat menggunakannya dengan $this->...()
di setiap templat:
escapeHtml()
: Ini sebenarnya memanfaatkan htmlspecialchars
dengan parameter yang disarankan untuk keluar dari HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);
- Anda juga dapat menentukan daftar putih dari tag yang diizinkan dan memanggil metode pada array untuk keluar dari semua elemen sekaligus. Gunakan ini untuk teks inline apa pun.quoteEscape()
: versi yang lebih sederhana tanpa pemrosesan daftar putih dan array tetapi yang ini lolos dari tanda kutip tunggal serta tanda kutip ganda, berguna untuk teks dalam atribut HTML .jsQuoteEscape()
: yang satu ini lolos dari tanda kutip tunggal dengan garis miring terbalik. Ini digunakan untuk menghindari string literal dalam JavaScript. Tapi ini tidak aman . (Contoh oleh @Xorax:) 'test\\\'+alert("powned");//'
. Diperlukan pelarian backslash tambahan. Gunakan quoteEscape()
sebagai gantinya!escapeUrl()
: Saya tidak tahu mengapa metode ini ada, itu bukan string URL encoding, itu hanya biasa saja htmlspecialchars()
tanpa parameter apa pun. Jangan gunakan itu. Pernah.
/**
* Escape html entities in url
*
* @param string $data
* @return string
*/
public function escapeUrl($data)
{
return htmlspecialchars($data);
}
Pada catatan terkait, ada urlEncode()
yang juga tidak menerapkan pengodean URL, tetapi base64 sebagai gantinya ... Jangan menggunakannya, jika Anda tidak tahu persis apa yang Anda butuhkan.
/**
* base64_encode() for URLs encoding
*
* @param string $url
* @return string
*/
public function urlEncode($url)
{
return strtr(base64_encode($url), '+/=', '-_,');
}
Ya, penamaannya tidak konsisten. Setelah semua nama-nama metode mengikuti skema somethingEscape()
tetapi kemudian seseorang memutuskan untuk mundur htmlEscape()
dan urlEscape()
mendukung metode baru dan lupa tentang quoteEscape()
dan jsQuoteEscape()
.
Anda harus selalu menggunakan fungsi terjemahan standar
Dalam contoh blok
<?php echo $this->__('Text goes here'); ?>
Di tempat lain
<?php echo Mage::helper('core')->__('Text goes here'); ?>
Dan gunakan dengan cara yang sama Anda gunakan sprintf
dengan PHP
Misalnya.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
Dalam contoh blok
<?php echo $this->escapeHtml('HTML goes here'); ?>
Di tempat lain
Menggunakan Mage/Core/Helper/Abstract.php
escapeHtml($data, $allowedTags = null)
Misalnya.
<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Mage_Core_Block_Abstract::htmlEscape()
sudah tidak digunakan pada Magento v 1.4.0.0-rc1 dan Mage_Core_Block_Abstract::escapeHtml()
harus digunakan sebagai gantinya.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Kelas Mage_Core_Block_Abstract
dan Mage_Core_Helper_Abstract
keduanya menggunakan fungsi yang sama Mage_Core_Helper_Abstract::escapeHtml
dan implementasinya internaly menggunakan fungsi PHP htmlspecialchars selain menerapkan beberapa logika tambahan untuk array dengan konten HTML.
Fungsi ini dapat diakses di semua blok dan kelas pembantu melalui $ this dan karena fungsi ini bersifat publik, Anda dapat menggunakannya melalui Mage :: helper ('core'), atau kelas pembantu lainnya, di tempat lain.