11.4. Zend_Filter_Input

11.4.1. Введение

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

  • Разработчики

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

  • Менеджеры

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

  • Аудиторы

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

Есть множество подходов к фильтрации входных данных и средств, применяемых разработчиками PHP. Фильтрация по "белому списку", по "черному списку", регулярные выражения, условные операторы, встроенные функции PHP - только несколько примеров из всего разнообразия подходов к фильтрации входных данных.

11.4.2. Теория

Для того, чтобы обеспечить структурный подход к фильтрации входных данных, Zend_Filter_Input пытается усилить контроль за доступом к входным данным поредством установки ссылки на массив исходных данных в null.

В подходе, принятом по умолчанию, (строгом) конструктору передается единственный аргумент - массив данных для фильтрации. Нефильтрованные данные могут быть получены только через метод getRaw().

<?php
// $_POST['email'] === 'webmaster@example.com'

// Фильтрация массива данных $_POST
require_once 'Zend/Filter/Input.php';
$filterPost = new Zend_Filter_Input($_POST);

// $_POST теперь равен null
echo null === $_POST ? 'yes' : 'no'; // prints 'yes'

// Получение необработанного значения e-mail
echo $filterPost->getRaw('email'); // prints 'webmaster@example.com'

Zend_Filter_Input устанавливает переданный массив ($_POST) в null, поэтому прямой доступ будет невозможным. (Необработанные данные будут доступны только через метод getRaw(), через который легче контролировать доступ к необработанным данным и/или полностью исключить его).

В опциональном (нестрогом) подходе конструктору в качестве второго аргумента передается false.

<?php
// $_POST['email'] === 'webmaster@example.com'

// Фильтрация массива данных $_POST
require_once 'Zend/Filter/Input.php';
$filterPost = new Zend_Filter_Input($_POST, false);

// $_POST не равен null
echo null === $_POST ? 'yes' : 'no'; // выводит 'no'

// Получение необработанного значение e-mail
echo $filterPost->getRaw('email'); // prints 'webmaster@example.com'

Использование фильтра будет в точности таким же, как в случае строгого подхода, но Zend_Filter_Input не устанавливает исходный массив ($_POST) в null, и таким образом, разработчики смогут по-прежнему обращаться к нему напрямую. Этот подход не рекомендуется, вместо него рекомендуется использовать строгий подход.

Zend_Filter_Input спроектирован для использования массивов данных. Многие источники входных данных уже охвачены суперглобальными массивами PHP ($_GET, $_POST, $_COOKIE и т.д.), массивы являются конструкцией, наиболее часто используемой для хранения входных данных из других источников. Если вам нужно фильтровать скалярные значения, см. Глава 11, Zend_Filter.