Как стать автором
Обновить

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

Время на прочтение3 мин
Количество просмотров9.5K
Поговорим о 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
Теги:
Хабы:
Всего голосов 21: ↑15 и ↓6+9
Комментарии0

Публикации

Истории

Работа

PHP программист
102 вакансии

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань