Як уникнути вихідних даних?


27

Чи є вбудований помічник Magento для втечі вихідних даних шаблону для запобігання XSS?

Або я просто повинен використовувати PHP htmlspecialcharsабо htmlentitiesфункції?


Якщо ви шукаєте Magento 2, зверніться до magento.stackexchange.com/q/156368/243
Fabian Schmengler

Відповіді:


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
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));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.