Как избежать выходных данных?
Вопрос
Существует ли встроенный помощник 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("<", ">"), array("<", ">"), htmlspecialchars("Lorem ipsum >", ENT_COMPAT, "UTF-8", false));