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

в 4:07, , рубрики: php, 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 rocksanitizerulesRule

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' => namespacetoRound::className()
    ]
];
$s = new Sanitize($config);

$s->round()->sanitize(7.4); // output: 7.0

Таким образом, можно осуществить подмену существующих правил или указать другие алиасы к правилам.

Установка

composer require romeoz/rock-sanitize:*

Проект на github

Автор: romeOz

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js