Bagaimana cara menghindari data keluaran?

Jawaban:

33

Ada beberapa metode pembantu tergantung pada konteksnya. Semua didefinisikan Mage_Core_Helper_Abstracttetapi juga di Mage_Core_Block_Abstract, sehingga Anda dapat menggunakannya dengan $this->...()di setiap templat:

  • escapeHtml(): Ini sebenarnya memanfaatkan htmlspecialcharsdengan 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().

Fabian Schmengler
sumber
jsQuoteEscape apakah ini benar-benar aman? Terlihat seperti str_replace ($ quote, '\\'. $ Quote, ...) tidak berfungsi dengan baik
Xorax
@Xorax poin yang sangat bagus. Saya akan memperbarui jawabannya.
Fabian Schmengler
21

Cukup terjemahkan

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 sprintfdengan PHP

Misalnya.

<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>

Atau menghindarinya

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'); ?>
Ben Lessani - Sonassi
sumber
Catatan penting: 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.
barell
5
Catatan penting lainnya: Terjemahan tidak luput dari apa pun . Cobalah: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler
3

Kelas Mage_Core_Block_Abstractdan Mage_Core_Helper_Abstractkeduanya menggunakan fungsi yang sama Mage_Core_Helper_Abstract::escapeHtmldan 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.

Domen Vrankar
sumber
-1

Untuk konversi Spanyol:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
jruzafa
sumber