Профессиональное программирование на 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; |
| |
|
В начало ←предыдущая следующая→ ... 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 | ||