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.