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

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 5 065 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое