Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

В качестве фильтрации можно понимать следующее:

  • Фильтрация/нормализация входящих данных. К примеру, у вас есть страница с формой ввода данных банковской карты. Формат подразумевает использование пробелов, чёрточек, точек — из других символов допускаются только цифры. В этом случае будет неплохо нормализовать данные, избавившись от нежелательных символов.
  • Валидация входящих данных. После нормализации можно осуществить валидацию данных в разрезе вашего бизнес контекста. Для начала неплохо было бы проверить ввёл ли пользователь правильное число символов, проверить принадлежность карты вендору и только после этого можно отправлять данные в онлайн-сервис.

Все эти действия можно осуществить при помощи компонента zend-filter.

Установка

Установить zend-filter можно через composer:

$ composer require zendframework/zend-filter

Единственной зависимостью данного компонента является zend-stdlib. Остальные пакеты устанавливать не обязательно, но желательно:

  1. zendframework/zend-servicemanager используется для компонента FilterChain чтобы осуществлять доступ к фильтрам по их сокращённым названиям.
  2. zendframework/zend-crypt используется для шифрования и дешифрования фильтров.
  3. zendframework/zend-uri юзается фильтром UriNormalize.
  4. zendframework/zend-i18n необходима для нескольких фильтров, которые направлены на интернациональные форматы данных.

В наших примерах будет использоваться класс FilterChain, поэтому загрузим компонент zend-servicemanager:

$ composer require zendframework/zend-servicemanager

FilterInterface

Каждый фильтр имплементирует интерфейс Zend\Filter\FilterInterface:

namespace Zend\Filter;

interface FilterInterface
{
    public function filter($value);
}

zend-filter включает в себя целый ряд готовых фильтров:

  • Преобразование строк, целых чисел и т.д., в булевы значения.
  • Преобразование строковых значений в целые числа.
  • Преобразование пустых значений в null.
  • Преобразование значений в объекты DateTime.
  • Нормализация URI.
  • Сравнений строк с белым/чёрным списком.
  • Очистка от пробелов, символов перехода новую строку, удаление HTML тегов или сущностей.
  • Работа с регистром строк.
  • Удаление всех значений, кроме цифр.
  • Замены по регулярным выражениям.
  • Преобразование формата слов (из camel-case в underscores и обратно).
  • Шифровка/дешифровка значений.
  • Сжатие/распаковка значение.

Каждый из перечисленных фильтров можно использовать в отдельности. А что если вам нужно применить сразу несколько фильтров? В этом случае можно воспользоваться цепочками из фильтров!

Цепочка фильтров — FilterChain

Как бы мы это делали без zend-filter:

$value = $request->getParsedBody()['phone'] ?? '';
$value = trim($value);
$value = preg_replace("/[^\n\r]/", '', $value);
$value = preg_replace('/[^\d]/', '', $value);

С zend-filter и классом FilterChain всё гораздо проще:

use Zend\Filter\FilterChain;

$filter = new FilterChain();
// attachByName uses the class name, minus the namespace, and
$filter->attachByName('StringTrim');
$filter->attachByName('StripNewlines');
$filter->attachByName('Digits');
$value = $filter->filter($request->getParsedBody()['phone'] ?? '');

Ещё один пример: предположим что у нас есть конфигурационный файл с ключами в формате snake_case_format и мы бы хотели чтобы в коде данные ключи преобразовались в формат CamelCase.

use Zend\Filter;

$filter = new Filter\FilterChain();
// attach lets you provide the instance you wish to use; this will work
// even without zend-servicemanager installed.
$filter->attach(new Filter\StringTrim());
$filter->attach(new Filter\StripNewlines()); // because we may have \r characters
$filter->attach(new Filter\Word\UnderscoreToCamelCase());

$configKeys = array_map([$filter, 'filter'], explode("\n", $fileContents));

Здорово, не правда ли?

На этом всё. Спасибо за внимание!

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: https://framework.zend.com/blog/2017-06-08-zend-filter.html
Перевел: Станислав Протасевич
Урок создан: 10 Июня 2017
Просмотров: 24169
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

  • Совет: активация отображения всех ошибок в PHP

    При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.

^ Наверх ^