Чи є вбудований помічник 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') або будь-який інший допоміжний клас скрізь в іншому місці.