Всем привет!
Продолжаю рассказывать об инструментах, которые позволяют обезопасить ваше веб-приложение. Сегодня это библиотека для санитизации данных.
Санитизация удаляет (или экранирует) неправильные или небезопасные символы из пользовательского ввода, либо правильным образом формирует выходные данные.
Итак, тот, кто уже познакомился с 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:*
Автор: romeOz