Фильтрация и дезинфекция

Очистка пользовательского ввода является важной частью разработки программного обеспечения. Доверие или пренебрежение очисткой пользовательского ввода может привести к несанкционированному доступу к содержимому приложения, в основном к данным пользователя, или даже к серверу, на котором размещается приложение.

 

Компонент Phalcon\Filter предоставляет набор часто используемых фильтров и помощников по очистке данных. Он предоставляет объектно-ориентированные оболочки вокруг расширения фильтра PHP.

Типы встроенных фильтров

Ниже приведены встроенные фильтры, предоставляемые этим компонентом:

ИмяОписание
absint Преобразует значение в целое число и возвращает его абсолютное значение.
alphanum Удалить все символы, кроме [A-zA-Z0-9]
email Удалить все символы, кроме букв, цифр и !#$%&*+-/=?^_{ / }~@.[]`.
float Удалить все символы, кроме цифр, точки, знака плюс и минус.
float! Удалить все символы, кроме цифр, точки, знака плюс и минус, и привести результат к float.
int Удалить все символы, кроме цифр, плюс и минус.
int! Удалить все символы, кроме цифр, плюс и минус и привести результат к integer.
lower Применить функцию strtolower
string Удалить теги и кодировать объекты HTML, включая одинарные и двойные кавычки.
striptags Применить функцию strip_tags
trim Применить функцию trim
upper Применить функцию strtoupper

Обратите внимание, что компонент использует внутреннюю PHP функцию filter_var.

Константы доступны и могут использоваться для определения требуемого типа фильтрации:

<?php
const FILTER_ABSINT     = "absint";
const FILTER_ALPHANUM   = "alphanum";
const FILTER_EMAIL      = "email";
const FILTER_FLOAT      = "float";
const FILTER_FLOAT_CAST = "float!";
const FILTER_INT        = "int";
const FILTER_INT_CAST   = "int!";
const FILTER_LOWER      = "lower";
const FILTER_STRING     = "string";
const FILTER_STRIPTAGS  = "striptags";
const FILTER_TRIM       = "trim";
const FILTER_UPPER      = "upper"; 

Очистка данных

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

<?php

use Phalcon\Filter;

$filter = new Filter();

// Возвращает 'someone@example.com'
$filter->sanitize('some(one)@exa\mple.com', 'email');

// Возвращает 'hello'
$filter->sanitize('hello<<', 'string');

// Возвращает '100019'
$filter->sanitize('!100a019', 'int');

// Возвращает '100019.01'
$filter->sanitize('!100a019.01a', 'float');

Очистка в контроллерах

Вы можете получить доступ к объекту Phalcon\Filter из ваших контроллеров при доступе к входным данным GET или POST (через объект запроса). Первый параметр-это имя переменной, которая будет получена; второй-фильтр, который будет применен к ней.

<?php

use Phalcon\Mvc\Controller;

class ProductsController extends Controller
{
    public function indexAction()
    {

    }

    public function saveAction()
    {
        // Очистка цены во входных данных
        $price = $this->request->getPost('price', 'double');

        // Очистка электронной почты при вводе
        $email = $this->request->getPost('customerEmail', 'email');
    }
}

Фильтрация параметров действия

В следующем примере показано, как очистить параметры действия в действии контроллера:

<?php

use Phalcon\Mvc\Controller;

class ProductsController extends Controller
{
    public function indexAction()
    {

    }

    public function showAction($productId)
    {
        $productId = $this->filter->sanitize($productId, 'int');
    }
}

Фильтрация данных

В дополнение к санированию Phalcon\Filter также обеспечивает фильтрацию путем удаления или изменения входных данных в ожидаемый формат.

<?php

use Phalcon\Filter;

$filter = new Filter();

// Возвращает 'Hello'
$filter->sanitize('<h1>Hello</h1>', 'striptags');

// Возвращает 'Hello'
$filter->sanitize('  Hello   ', 'trim');

Объединение фильтров

Вы также можете запускать несколько фильтров в строке одновременно, передавая массив идентификаторов фильтра в качестве второго параметра:

<?php

use Phalcon\Filter;

$filter = new Filter();

// Возвращает 'Hello'
$filter->sanitize(
    '   <h1> Hello </h1>   ',
    [
        'striptags',
        'trim',
    ]
);

Добавление фильтров

Вы можете добавить свои собственные фильтры в Phalcon\Filter. Функция фильтра может быть анонимной функцией:

<?php

use Phalcon\Filter;

$filter = new Filter();

// Использование анонимной функции
$filter->add(
    'md5',
    function ($value) {
        return preg_replace('/[^0-9a-f]/', '', $value);
    }
);

// Санитировать с помощью фильтра 'md5'
$filtered = $filter->sanitize($possibleMd5, 'md5');

Или, если хотите, вы можете реализовать фильтр в классе:

<?php

use Phalcon\Filter;

class IPv4Filter
{
    public function filter($value)
    {
        return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
    }
}

$filter = new Filter();

// Использование объекта
$filter->add(
    'ipv4',
    new IPv4Filter()
);

// Санитировать с помощью фильтра 'ipv4'
$filteredIp = $filter->sanitize('127.0.0.1', 'ipv4');

Комплексная санация и фильтрация

Сам PHP обеспечивает превосходное расширение фильтра, которое вы можете использовать. Ознакомьтесь с его документацией: Фильтрация данных в документации PHP

Внедрение собственного фильтра

Интерфейс Phalcon\FilterInterface должен быть реализован для создания собственной службы фильтрации, заменяющей ее, предоставленную Phalcon.