Есть ли встроенный помощник Magento для экранирования выходных данных шаблона для предотвращения XSS?
Или я должен просто использовать PHP htmlspecialchars
или htmlentities
функции?
Есть ли встроенный помощник Magento для экранирования выходных данных шаблона для предотвращения XSS?
Или я должен просто использовать PHP htmlspecialchars
или htmlentities
функции?
Ответы:
Есть несколько вспомогательных методов в зависимости от контекста. Все они определены в, Mage_Core_Helper_Abstract
но также и в Mage_Core_Block_Abstract
, так что вы можете использовать их $this->...()
в каждом шаблоне:
escapeHtml()
: Он фактически использует htmlspecialchars
рекомендуемые параметры для экранирования HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);
- кроме того, вы можете указать белый список разрешенных тегов и вызвать метод в массиве, чтобы экранировать все элементы одновременно. Используйте это для любого встроенного текста.quoteEscape()
: более простая версия без белого списка и обработки массива, но эта экранирует как одинарные, так и двойные кавычки, что полезно для текста в атрибуте HTML .jsQuoteEscape()
: этот экранирует одинарные кавычки с обратной косой чертой. Он используется для экранирования строковых литералов в JavaScript. Но это не безопасно . (Пример от @Xorax:) 'test\\\'+alert("powned");//'
. Необходим дополнительный выход из обратной косой черты. Используйте quoteEscape()
вместо этого!escapeUrl()
Я не знаю, почему этот метод существует, это не строки кодирования URL, а просто старый htmlspecialchars()
без каких-либо параметров. Не используйте это. Когда-либо.
/**
* Escape html entities in url
*
* @param string $data
* @return string
*/
public function escapeUrl($data)
{
return htmlspecialchars($data);
}
На заметку о том, urlEncode()
что также применяется не кодирование URL, а base64 ... Не используйте его, если вы точно не знаете, что вам нужно.
/**
* base64_encode() for URLs encoding
*
* @param string $url
* @return string
*/
public function urlEncode($url)
{
return strtr(base64_encode($url), '+/=', '-_,');
}
Да, наименование противоречиво. После того, как все эти имена методов были по схеме , somethingEscape()
но потом кто - то решил принизить htmlEscape()
и urlEscape()
в пользу новых методов и забыли о quoteEscape()
и jsQuoteEscape()
.
Вы всегда должны использовать стандартную функцию перевода
В экземпляре блока
<?php echo $this->__('Text goes here'); ?>
Где-нибудь еще
<?php echo Mage::helper('core')->__('Text goes here'); ?>
И использовать его так же, как вы использовали бы sprintf
с PHP
Например.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
В экземпляре блока
<?php echo $this->escapeHtml('HTML goes here'); ?>
Где-нибудь еще
С помощью Mage/Core/Helper/Abstract.php
escapeHtml($data, $allowedTags = null)
Например.
<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Mage_Core_Block_Abstract::htmlEscape()
устарело с Magento v 1.4.0.0-rc1 и Mage_Core_Block_Abstract::escapeHtml()
должно использоваться вместо него.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Классы Mage_Core_Block_Abstract
и Mage_Core_Helper_Abstract
оба используют одну Mage_Core_Helper_Abstract::escapeHtml
и ту же функцию, и ее реализация внутренне использует функцию PHP htmlspecialchars, кроме реализации некоторой дополнительной логики для массивов с содержимым HTML.
Доступ к функции возможен во всех классах блоков и помощников через $ this, и поскольку функция общедоступна, вы можете использовать ее через Mage :: helper ('core') или какой-либо другой вспомогательный класс, где угодно.