XSS'yi önlemek için çıktı şablon verisinden kaçmak için yerleşik bir Magento yardımcısı var mı?
Yoksa sadece PHP htmlspecialchars
veya htmlentities
işlevler kullanmalı mıyım?
XSS'yi önlemek için çıktı şablon verisinden kaçmak için yerleşik bir Magento yardımcısı var mı?
Yoksa sadece PHP htmlspecialchars
veya htmlentities
işlevler kullanmalı mıyım?
Yanıtlar:
Bağlama bağlı olarak birkaç yardımcı yöntem vardır. Hepsi Mage_Core_Helper_Abstract
aynı zamanda içinde tanımlanmıştır Mage_Core_Block_Abstract
, böylece $this->...()
her şablonda kullanabilirsiniz:
escapeHtml()
: Aslında htmlspecialchars
HTML'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()
.
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 sprintf
PHP ile aynı şekilde kullanın
Örneğin.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
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'); ?>
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.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Sınıflar Mage_Core_Block_Abstract
ve Mage_Core_Helper_Abstract
her ikisi de aynı işlevi Mage_Core_Helper_Abstract::escapeHtml
kullanı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.