Как избежать выходных данных?

27

Есть ли встроенный помощник Magento для экранирования выходных данных шаблона для предотвращения XSS?

Или я должен просто использовать PHP htmlspecialcharsили htmlentitiesфункции?

Аарон Поллок
источник
Если вы ищете Magento 2, пожалуйста, обратитесь к magento.stackexchange.com/q/156368/243
Фабиан Шменглер

Ответы:

33

Есть несколько вспомогательных методов в зависимости от контекста. Все они определены в, 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().

Фабиан Шменглер
источник
jsQuoteEscape действительно ли это безопасно? Похоже, что str_replace ($ quote, '\\'. $ Quote, ...) не выполняет свою работу ... gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax
@Xorax очень хорошая мысль. Я обновлю ответ.
Фабиан Шменглер
21

Просто переведите это

Вы всегда должны использовать стандартную функцию перевода

В экземпляре блока

<?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()должно использоваться вместо него.
barell
5
Еще одно важное замечание: перевод ничего не ускользает . Попробуйте это: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Фабиан Шменглер
3

Классы Mage_Core_Block_Abstractи Mage_Core_Helper_Abstractоба используют одну Mage_Core_Helper_Abstract::escapeHtmlи ту же функцию, и ее реализация внутренне использует функцию PHP htmlspecialchars, кроме реализации некоторой дополнительной логики для массивов с содержимым HTML.

Доступ к функции возможен во всех классах блоков и помощников через $ this, и поскольку функция общедоступна, вы можете использовать ее через Mage :: helper ('core') или какой-либо другой вспомогательный класс, где угодно.

Домен Вранкар
источник
-1

Для испанского конвертировать:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
jruzafa
источник