06 Фильтры
Фильтрация и дезинфекция
Очистка пользовательского ввода является важной частью разработки программного обеспечения. Доверие или пренебрежение очисткой пользовательского ввода может привести к несанкционированному доступу к содержимому приложения, в основном к данным пользователя, или даже к серверу, на котором размещается приложение.
Компонент Phalcon\Filter предоставляет набор часто используемых фильтров и помощников по очистке данных. Он предоставляет объектно-ориентированные оболочки вокруг расширения фильтра PHP.
Типы встроенных фильтров
Ниже приведены встроенные фильтры, предоставляемые этим компонентом:
| Имя | Описание |
|---|---|
| absint | Преобразует значение в целое число и возвращает его абсолютное значение. |
| alphanum | Удалить все символы, кроме [A-zA-Z0-9] |
| Удалить все символы, кроме букв, цифр и !#$%&*+-/=?^_{ / }~@.[]`. | |
| 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.