Вопрос

Существует ли встроенный помощник 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 а также Mage_Core_Helper_Abstract Оба используют одну и ту же функцию Mage_Core_Helper_Abstract::escapeHtml И его реализация Internalaly использует функцию PHP HTMLSpecialChars, помимо реализации некоторой адероальной логики для массивов с содержанием HTML.

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

Для испанского обращения:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top