Çıktı verilerinden nasıl kaçılır?


Yanıtlar:


33

Bağlama bağlı olarak birkaç yardımcı yöntem vardır. Hepsi Mage_Core_Helper_Abstractaynı zamanda içinde tanımlanmıştır Mage_Core_Block_Abstract, böylece $this->...()her şablonda kullanabilirsiniz:

  • escapeHtml(): Aslında htmlspecialcharsHTML'den çıkmak için önerilen parametrelerden yararlanır: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);- ayrıca, izin verilen etiketlerin bir beyaz listesini belirleyebilir ve tüm öğelerin aynı anda kaçması için bir dizideki yöntemi çağırabilirsiniz. Herhangi bir satır içi metin için bunu kullanın.
  • quoteEscape(): beyaz liste ve dizi işlemesi olmadan daha basit bir sürüm ancak bu, HTML niteliğindeki metinler için kullanışlı olan tek tırnakların yanı sıra çift tırnak işaretlerinden de kaçar .
  • jsQuoteEscape(): bu, ters eğik çizgi ile tek tırnaklardan kaçar. JavaScript'te string değişmezlerinden kaçmak için kullanılır. Ancak bu güvenli değil . (@Xorax örneği:) 'test\\\'+alert("powned");//'. Ters eğik çizgilerin ek olarak kaçması gerekir. Yerine quoteEscape()kullanın!
  • escapeUrl(): Bu yöntemin neden var olduğunu bilmiyorum, URL kodlama dizeleri değil , htmlspecialchars()herhangi bir parametresiz düz eski . Kullanmayın. Hiç.

    /**
     * Escape html entities in url
     *
     * @param string $data
     * @return string
     */
    public function escapeUrl($data)
    {
        return htmlspecialchars($data);
    }
  • İlgili bir notta, urlEncode()URL kodlaması uygulanmayan, ancak bunun yerine base64 de var ... Tam olarak neye ihtiyacınız olduğunu bilmiyorsanız, kullanmayın.

    /**
     *  base64_encode() for URLs encoding
     *
     *  @param    string $url
     *  @return   string
     */
    public function urlEncode($url)
    {
        return strtr(base64_encode($url), '+/=', '-_,');
    }

Evet, adlandırma tutarsız. Bütün sonra bu yöntem adları düzeni takip ediyorlardı somethingEscape()ama sonra birileri kaldırmaya karar htmlEscape()ve urlEscape()yeni yöntemler lehine ve unuttuğunu quoteEscape()ve jsQuoteEscape().


jsQuoteEscape gerçekten güvenli mi? Str_replace iş yapmaz ... (., '\\' $ alıntı ... $ alıntı) gibi bak gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax

@ Xorax çok iyi bir nokta. Cevabı güncelleyeceğim.
Fabian Schmengler

21

Sadece çevir

Her zaman standart çeviri işlevini kullanıyor olmalısınız

Bir blok örneğinde

<?php echo $this->__('Text goes here'); ?>

Başka herhangi bir yer

<?php echo Mage::helper('core')->__('Text goes here'); ?>

Ve sprintfPHP ile aynı şekilde kullanın

Örneğin.

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

Ya da kaç

Bir blok örneğinde

<?php echo $this->escapeHtml('HTML goes here'); ?>

Başka herhangi bir yer

kullanma Mage/Core/Helper/Abstract.php

escapeHtml($data, $allowedTags = null)

Örneğin.

<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>

Önemli not: Mage_Core_Block_Abstract::htmlEscape()Magento v 1.4.0.0-rc1 tarihinden itibaren kullanımdan kaldırılmıştır ve Mage_Core_Block_Abstract::escapeHtml()bunun yerine kullanılmalıdır.
halter

5
Bir başka önemli not: Çeviri hiçbir şeyden kaçmaz . Deneyin: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler

3

Sınıflar Mage_Core_Block_Abstractve Mage_Core_Helper_Abstracther ikisi de aynı işlevi Mage_Core_Helper_Abstract::escapeHtmlkullanır ve kendi içinde uygulamalı olarak HTML içeriğine sahip diziler için bazı ek mantıkları uygulamanın yanı sıra PHP htmlspecialchars işlevini kullanır.

İşleve $ this aracılığıyla tüm blok ve yardımcı sınıflarında erişilebilir ve işlev genel olduğundan, onu Mage :: yardımcı ('çekirdek') veya başka bir yardımcı sınıf aracılığıyla başka bir yerde kullanabilirsiniz.


-1

İspanyolca dönüştürmek için:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
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.