Rock Sanitize — простой и гибкий санитизатор

от автора

Поговорим о Rock SanitizeВсем привет!

Продолжаю рассказывать об инструментах, которые позволяют обезопасить ваше веб-приложение. Сегодня это библиотека для санитизации данных.

Санитизация удаляет (или экранирует) неправильные или небезопасные символы из пользовательского ввода, либо правильным образом формирует выходные данные.

Итак, тот, кто уже познакомился с 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:* 

Проект на github

ссылка на оригинал статьи http://habrahabr.ru/post/254045/