Профессиональное программирование на PHP

Страница 567 из 591


SAPI-интерфейсы 587

на то, что все, кто причастен к разработке PHP-кода, предпримут корректные меры безопасности.

■ Очистка всех данных в РНР при каждом запросе может оказаться медленным процессом.

Чтобы помочь в решении этой проблемы, в SAPI-интерфейсе обеспечен набор из трех обратных вызовов, которые можно использовать для автоматической очистки данных в ходе каждого входящего запроса: input_f ilter, treat_data и def ault_ post_reader. Так как эти вызовы регистрируются на уровне SAPI, они невидимы для разработчика и выполняются автоматически. Это не позволит разработчику забыть их использовать на странице. Более того, так как они реализованы на С и выполняются до того, как данные помещаются в автоглобальные массивы, такая реализация может оказаться гораздо более быстрой, чем код, написанный на РНР.

input_filter

Самым полезным из фильтрующих обратных вызовов является sapi_module_ struct. input_f ilter. Зарегистрированный обратный вызов input_f ilter выполняется для входных данных, которые должны заполнить автоглобальные массивы $_POST, $_GET и $_С00К1Е до того, как данные попадут в эти массивы. Обратный вызов input_f ilter предоставляет защитный механизм для очистки введенных пользователем данных до того, как они станут доступными для кода пользовательского пространства.

В этом разделе описывается input_f ilter, который удаляет весь HTML-код из POST-, GET- и COOKIE-данных с помощью С-кода из PHP-функции strip_tags (). Это вариант примера input_f ilter в дистрибутиве РНР с некоторыми добавлениями. Создается новый набор автоглобальных массивов— $_RAW_POST, $_RAW_GET и $_RAW_C000KIE, и исходное содержимое каждой переменной помещается в новый массив, а очищенные данные направляются в стандартные массивы. Таким образом, при необходимости разработчик может получить доступ к исходным данным, но данные в стандартных массивах будут очищены от HTML-кода.

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

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

#ifdef HAVE_CONFIG_H

# include "config.h" #endif

#include "php.h" #include "php_globals.h" #include "php_variables.h" #include "ext/standard/info.h"

# include "ext/standard/PHP_string.h"

ZEND_BEGIN_MODULE_GLOBALS(raw_f ilter) zval *post_array; zval *get_array;




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006