Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Рецепт защиты звучит просто: данные нужно фильтровать и экранировать.
PHP фильтрация данных — дело не простое. К примеру, чтобы экранировать HTML вам потребуется вызвать функцию htmlspecialchars()
, с флагами ENT_QUOTES | ENT_SUBSTITUTE
, а также указать кодировку символов:
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'utf-8')
Эффективное экранирование HTML атрибутов, CSS и JavaScript кода требует намного большей скрупулёзности. Следует брать во внимание преобразование символов из одной кодировки в другую, регулярные выражения и многое другое. Само собой напрашивается дополнительное решение.
В Zend Framework есть компонент zend-escaper, в котором присутствуют все нужные инструменты для экранирования HTML, HTML атрибутов, JavaScript, CSS кода и URL.
Установка
Для работы zend-escaper требуется PHP (версии не ниже 5.5), установить можно через composer:
$ composer require zendframework/zend-escaper
Использование
Для работы с компонентом необходимо создать объект класса Zend\Escaper\Escaper
.
use Zend\Escaper\Escaper; $escaper = new Escaper('iso-8859-1');
Если не указать кодировку символов самим, то компонент выставит значение по умолчанию utf-8
. Инициализация без аргументов:
use Zend\Escaper\Escaper; $escaper = new Escaper();
В классе присутствуют следующие методы:
escapeHtml(string $html) : string
экранирование HTML кода. Данный метод преобразует символы<
,>
, на символ&
.escapeHtmlAttr(string $value) : string
экранирование строки для использования в HTML атрибутах.escapeJs(string $js) : string
экранирование JS скрипта, которое преобразует тег<script>
. Защита от XSS атак.escapeCss(string $css) : string
экранирование CSS кода<style>
; Защита от XSS кода.escapeUrl(string $urlPart) : string
экранирование URL, а точнее части URL, например параметров.
Пример:
echo $escaper->escapeHtml('<script>alert("zf")</script>'); // результат "<script>alert("zf")</script>" echo $escaper->escapeHtmlAttr("<script>alert('zf')</script>"); // результат "<script>alert('zf')</script>" echo $escaper->escapeJs("bar"; alert("zf"); var xss="true"); // результат "bar\x26quot\x3B\x3B\x20alert\x28\x26quot\x3Bzf\x26quot\x3B\x29\x3B\x20var\x20xss\x3D\x26quot\x3Btrue" echo $escaper->escapeCss("background-image: url('/zf.png?</style><script>alert(\'zf\')</script>');"); // результат "background\2D image\3A \20 url\28 \27 \2F zf\2E png\3F \3C \2F style\3E \3C script\3E alert\28 \5C \27 zf\5C \27 \29 \3C \2F script\3E \27 \29 \3B" echo $escaper->escapeUrl('/foo " onmouseover="alert(\'zf\')'); // результат "%2Ffoo%20%22%20onmouseover%3D%22alert%28%27zf%27%29"
Где это применять?
- В файлах шаблонов, будь то zend-view или Plates.
- В шаблонах электронных писем.
- В API сериалайзерах для экранирования URL или XML атрибутов.
- Для защиты от XSS атак.
Пишите безопасные приложения!
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: https://framework.zend.com/blog/2017-05-16-zend-escaper.html
Перевел: Станислав Протасевич
Урок создан: 9 Июня 2017
Просмотров: 19347
Правила перепечатки
5 последних уроков рубрики "PHP"
-
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
-
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
-
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
-
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
-
Совет: активация отображения всех ошибок в PHP
При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.