Всем привет!
Продолжаю рассказывать об инструментах, которые позволяют обезопасить ваше веб-приложение. Сегодня это библиотека для санитизации данных.
Санитизация удаляет (или экранирует) неправильные или небезопасные символы из пользовательского ввода, либо правильным образом формирует выходные данные.
Итак, тот, кто уже познакомился с Rock Validate будет приятно удивлён похожим синтаксисом:
Sanitize::removeTags() ->lowercase() ->sanitize('<b>Hello World!</b>'); // output: hello world!
либо через конструктор:
(new Sanitize)->removeTags()->lowercase()->sanitize('<b>Hello World!</b>');
Правила
Набор правил, пока недостаточно большой, но может с лёгкостью компенсироваться кастомизацией.
Существуют группы правил:
- строковые
- числовые
- приведение к типу
Отмечу некоторые из них.
call()
В качестве первого аргумента принимает callable значение. Пример:
$s = Sanitize::call('mb_strtolower', ['UTF-8']); $s->sanitize('ПрИвЕт МиР!'); // output: привет мир!
unserialize()
Автоматически определяет, является ли строка json или php представлением, а затем соответствующем образом десериализует её.
$s = Sanitize::unserialize()->removeTags()->trim() $s->sanitize('{"name" : " <b> Tom </b> "}'); /* output: [ 'name' => 'Tom' ] */
Санитизация по атрибутам
Для санитизации массива/объекта по атрибутам используется метод attributes().
$input = [ 'name' => '<b>Tom</b>', 'age' => -22 ]; $attributes = [ 'name' => Sanitize::removeTags(), 'age' => Sanitize::abs() ]; Sanitize::attributes($attributes)->sanitize($input); /* output: [ 'name' => 'Tom', 'age' => 22 ] */
В том случае, если необходимо использовать одно правило на все атрибуты, то:
$input = [ 'name' => '<b>Tom</b>', 'email' => '<b>tom@site.com</b>', ]; Sanitize::attributes(Sanitize::removeTags())->sanitize($input); /* output: [ 'name' => 'Tom', 'email' => 'tom@site.com' ] */
По умолчанию включён рекурсивный обход по атрибутам массива/объекта. Пример:
$input = [ 'name' => '<b>Tom</b>', 'other' => [ 'email' => '<b>tom@site.com</b>', 'note' => [ '<b>text...</b>' ] ] ]; Sanitize::attributes(Sanitize::removeTags())->sanitize($input); /* output: [ 'name' => 'Tom', 'other' => [ 'email' => 'tom@site.com', 'note' => [ 'text...' ] ] ] */
Можно отключить это поведение:
Sanitize::recursive(false)->attributes(Sanitize::removeTags());
Дополнительные возможности
Предусмотрена возможность указать набор правил по остаточному принципу, а именно:
$input = [ 'name' => '<b> Tom</b>', 'email' => '<b>tom@site.com </b>', 'age' => -22, ]; $s = Sanitize::attributes([ 'age' => Sanitize::abs(), '*' => Sanitize::removeTags()->trim() ]); $s->sanitize($input); /* output: [ 'name' => 'Tom', 'email' => 'tom@site.com', 'age' => 22, ] */
Метку «*» можно заменить на любую другую:
Sanitize::labelRemainder('_remainder');
Аналогичная возможность теперь доступна в Rock Validate.
Если необходима санитизация атрибута находящегося в глубине массива, то можно указать цепочку из ключей:
$input = [ 'name' => '<b>Tom</b>', 'other' => [ 'tel' => '<b>777-777</b>', 'email' => '<b>tom@site.com</b>', 'note' => [ 'first' => '<b> text... </b> ', ] ] ]; $attributes = [ 'other.email' => Sanitize::removeTags(), 'other.note.first' => Sanitize::removeTags()->trim() ]; Sanitize::attributes($attributes)->sanitize($input); /* output: [ 'name' => '<b>Tom</b>', 'other' => [ 'tel' => '<b>777-777</b>', 'email' => 'tom@site.com', 'note' =>[ 'first' => 'text...', ] ] ] */
Данная возможность доступна только для массивов.
Кастомизация
Создаём класс с правилом:
use rock\sanitize\rules\Rule class Round extends Rule { protected $precision = 0; public function __construct($precision = 0) { $this->precision= $precision; } public function sanitize($input) { return round($input, $this->precision); } }
Профит:
$config = [ 'rules' => [ 'round' => \namespace\to\Round::className() ] ]; $s = new Sanitize($config); $s->round()->sanitize(7.4); // output: 7.0
Таким образом, можно осуществить подмену существующих правил или указать другие алиасы к правилам.
Установка
composer require romeoz/rock-sanitize:*
ссылка на оригинал статьи http://habrahabr.ru/post/254045/
Добавить комментарий