РНР. Полное руководство и справочник функций [Михаил Юрьевич Лукьянов] (pdf) читать онлайн

-  РНР. Полное руководство и справочник функций  (и.с. Полное руководство) 25.95 Мб, 434с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Михаил Юрьевич Лукьянов

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
  [Оглавление]

Эта книга - 100%-ная гарантия вашего уверенного
программирования на РНР. Освой сам РНР "с нуля"!

Лукьянов М. Ю.

ПОЛНОЕ РУКОВОДСТВО
и

СПРАВОЧНИК ФУНКЦИЙ

"Наука и Техника"

Санкт-Петербург

УДК 004.43; ББК 32.973
ISBN 978-5-94387-796-4
ЛУКЬЯНОВ

РНР. П

м. Ю.

олное руководство и СПРАВОЧНИК функций. - СПб.: Наука
и Техника, 2020. - 432 с., ил.
Серия «Полное руководство»
Если вы интересуетесь веб-программированием и разработкой динамических
веб-сайтов-эта книга для Вас!
Наша книга поможет вам освоить язык РПР практически с нуля-от самых­
самых основ до создания своих собственных приложений и библиотек
кода. Пошаговые примеры помогут вам разобраться с многочисленными
функциями РНР; вы узнаете, как правильно использовать строки; что
такое массивы и какие действия с ними можно выполнять; вы узнаете, как
используется ООП (объектно-ориентированное программирование) в РНР;
научитесь использовать РПР-сеансы и получать доступ к параметрам формы
и загруженным файлам; узнаете, как отправить Cookies и перенаправить
браузер или как получить доступ к базам данных из РНР; поработаете с
графикой в РНР и научитесь динамически генерировать изображения с
помощью РНР; узнаете, как сделать свои веб-приложения безопасными и
защитить их от наиболее распространенных и опасных атак и многое-многое
другое.
Большая часть книги посвящена подробному Справочнику функций РПР для каждой функции в этом справочнике будет указано: ее имя, принимаемые
параметры с типами данных, будет сказано, какой из параметров
обязательный, а какой - нет, также будут приведены краткое описание
функции, побочные эффекты, ошибки и возвращаемые функцией структуры
данных. Для удобства справочник составлен в алфавитном порядке.
Книга будет полезна программистам любого уровня - от самых начинающих
до продвинутых пользователей, каждый найдет здесь для себя много
полезного.

1

ISBN 978-5-94387-796-4

9 78- 5- 94387- 796- 4

Контактные телефоны издательства:
(812)4127026
Официальный сайт: www.nit.com.ru
© Лукьянов

М.Ю.

© Наука и Техника (оригинал-макет)

Содержание
ГЛАВА 1. ВВЕДЕНИЕ В·РНР ......................... 11
1.1.ЧТОДЕЛАЕТРНР?..................................................................... 11
1.3.УСТАНОВКА РНР ....................................................................... 12
1.4.ОБЗОР РНР ............................................................................. 13
Конфигурация системы .............................................................. 14
Формы ....................................................................................... 15
Базы данных ...............................................................................16
Графика ................. : ................................................................... 18

ГЛАВА 2. ОСНОВЫ ЯЗЫКА .......................... 21
2.1. ЛЕКСИЧЕСКАЯ СТРУКТУРА ........................................................ 21
2.1.1. Чувствительность к регистру ............................................ 21
2.1.2. Операторы и точки с запятыми ......................................... 21
2.1.3. Пробелы и разрывы строк.................................................22
2.1.4. Комментарии.................................................................... 23
2.1.5. Литералы.......................................................................... 26
2.1.6. Идентификаторы ·.............................................................. 27
Имена переменных ...............................................................27
Имена функций ..................................................................... 27
Имена классов ...................................................................... 28
Константы ............................................................................. 28
2.2. КЛЮЧЕВЫЕ СЛОВА .................................................................. 28
2.3. ПЕРЕМЕННЫЕ ..........................................•.............................. 38
2.3.1. Переменные переменных ................................................. 39
2.3.2. Переменные-ссылки......................................................... 39
2.3.3. Области видимости переменных ......................................40
2.3.4. Сбор мусора (Garbage Collection) .....................................43
2.4. ВЫРАЖЕНИЯ И ОПЕРАТОРЫ ...................................................... 44
2.4.1. Количество операндов......................................................46

•:

2.4.2. Приоритет операторов .....................................................46

_________________________________________________________________________________ __

РНР. Полное руководство и справочник функций
2.4.3. Порядок выполнения операторов .....................................47
2.4.4. Неявное приведение типа.................................................48
2.4.5. Арифметические операторы ............................................ .49
2.4.6. Оператор конкатенации строки ........................................ 50
2.4.7. Операторы инкремента и декремента...............................50
2.4.8. Операторы сравнения ................................................. : .... 52
2.4.9. Поразрядные (побитовые) операторы ..............................54
2.4.1О. Логические операторы ................................................... 56
2.4.11. Операторы приведения типов ......................................... 57
2.4.12. Оператор присваивания ................................................. 58
2.4.13. Разные операторы: подавление ошибок и другие ...........60
2.5. ОПЕРАТОРЫ УПРАВЛЕНИЯ ВЫПОЛНЕНИЕМ.................................. 61
2.5.1. Оператор if ....................................................................... 61
2.5.2. Оператор switch ................................................................ 63
2.5.3. Оператор while.................................................................. 65
2.5.4. Цикл for. Цикл со счетчиком ..............................................68
2.5.5. Оператор foreach ..............................................................69
2.5.6. Конструкция try...catch ......................................................70
2.5.7. Оператор declare ..............................................................70
2.5.8. Операторы exit и return .....................................................71
2.5.9. Оператор goto .................................................................. 72
2.6. ВКЛЮЧЕНИ.Е КОДА.......................................................... , ........ 72
2.7. ВНЕДРЕНИЕ РНР В WЕВ-СТРАНИЦЫ ............................................ 74

ГЛАВА 3. ФУНКЦИИ ................................... 79
3.1. ВЫЗОВ ФУНКЦИИ .................................................................... 79
3.2. ОПРЕДЕЛЕНИЕ ФУНКЦИИ ......................................................... 80
3.3. ОБЛАСТЬ ДЕЙСТВИЯ ПЕРЕМЕННОЙ ............................................ 83
3.4. ПАРАМЕТРЫ ФУНКЦИИ ............................................................. 85
3.5. ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ..................................................... 90

....

3.6. ПЕРЕМЕННЫЕ ФУНКЦИИ. ОБРАЩЕНИЕ
К ФУНКЦИЯМ ЧЕРЕЗ ПЕРЕМЕННЫЕ ...................................... 91

....



-.......................... - .......... - ---- -........ ---- -...........--.. - - . :

Содержани
3.7. АНОНИМНЫЕ ФУНКЦИИ ............................................................ 92

ГЛАВА 4. СТРОКИ ...................................... 94
4. 1. СПОСОБЫ ЗАПИСИ СТРОКОВЫХ КОНСТАНТ ................................. 94
4.2. ВЫВОД СТРОК ........................................................................ 98
4.2.1. Конструкция echo ............................................................. 98
4.2.2. Функция print() .................................................................. 99
4.2.3. Функция printf() ................................................................. 99
4.2.4. Функции print_r() и var_dump() ........................................ 102
4.3. ПОЛУЧЕНИЕ ДОСТУПА К ОТДЕЛЬНЫМ СИМВОЛАМ...................... 103
4.4. ОЧИСТКА СТРОК .................................................................... 104
4.5. КОДИРОВАНИЕ И ЭКРАНИРОВАНИЕ .......................................... 106
4.5.1. В формат НТМL .............................................................. 106
Экранирование всех специальных символов............................ 106
Экранирование только символов синтаксиса HTML ................. 107
Удаление НТМL-тегов .............................................................. 108
Извлечение МЕТА-тегов ........................................................... 109
4.5.2. Конвертирование в URL .................................................. 109
Кодирование и декодирование по RFC 3986 ............................ 109
Кодирование строки параметров ............................................. 11О
4.5.3. В формат SQL ................................................................. 11О
4.5.4. Кодирование С-строк ..................................................... 111
4.6. СРАВНЕНИЕ СТРОК ................................................., .............. 112
4.7. МАНИПУЛЯЦИЯ И ПОИСК СТРОК .............................................. 115
4.7.1. Подстроки ...................................................................... 116
4.7.2. Разные строковые функции ............................................ 117
4.7.3. Декомпозиция строки. Разбиение строки ....................... 118
4.7.4. Функции поиска строк .................................................... 120
4.8. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ ..................................... : ............... 123
4.8.1. Основные положения использования регулярных
выражений ............................................................................... 123

...

4.8.2. Классы символов .., ......................................................... 124
4.8.3. Альтернативы ................................................................. 125
4.8.4. Повторяющиеся последовательности ............................. 126

'-...- --...·---- - - - -..................... ··-·..... ........................·-....

РНР. Полное руководство и справочник функций

4.8.5. Подшаблоны ................................................................... 127
4.8.6. Разделители ......................................................... , ......... 127
4.8.7. Поведение соответствия ................................................ 128
4.8.8. Классы символов ............................................................ 128
4.8.9. Якоря.............................................................................. 129
4.8.10. Квантификаторы и жадность ......................................� .. 130
4.8.11. Нефиксируемые группы................................................131
4.8.12. Обратные ссылки .......................................................... 131
4.8.13. Флаги ........................................................................... 132
4.8.14. Встроенные опции ........................................................ 133
4.8.15. Опережающие и ретроспективные утверждения ........... 134
4.8.16. Сокращения или однократные подмаски ...................... 135
4.8.17. Условные выражения .................................................... 136
4.8.18. Функции .: ..................................................................... 136
4.8.19. Отличия от регулярных выражений Perl ......................... 143

ГЛАВА 5. МАССИВЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ·. . . . . 145
5.1. ИНДЕКСИРОВАННЫЕ И АССОЦИАТИВНЫЕ МАССИВЫ .................. 145
5.2. ИДЕНТИФИКАЦИЯ ЭЛЕМЕНТОВ МАССИВА ................................. 146
5.3. ХРАНЕНИЕ ДАННЫХ В МАССИВАХ ............................................. 147.
Добавление значений в конец массива .................................... 148
Присваивание диапазона значений............................... :.......... 148
Получение размера массива .................................................... 149
Заполнение массива ................................. :............ :.................149
5.4. МНОГОМЕРНЫЕ МАССИВЫ ..................................................... 150
5.5. ИЗВЛЕЧЕНИЕ НЕСКОЛЬКИХ ЗНАЧЕНИЙ ..................................... 150
«Вырезка» из массива ..............•............................................... 151
Разделение массива на несколько массивов ........................... 152
Ключи и значения ........................................................ : ............ 152Проверка существования элемента массива ........................... 153
Удаление и вставка элементов в массив .................................. 154
5.6. ПРЕОБРАЗОВАНИЕ МЕЖДУ МАССИВАМИ И ПЕРЕМЕННЫМИ ......... 155
Создание переменных из массива ........................................... 155
Создание массива из переменных ........................................... 156



118---------------------------------------------------------------------------------:


Содержание
5.7. ОБХОД МАССИВОВ ................................................................ 156
Конструкция foreach .................................................................157
Функции-итераторы ................................................................. 157
Использование цикла for ..........................................................159
Вызов функции для каждого элемента массива .......................159
Сокращение массива ............................................................... 161
Поиск значений ........................................................................162
5.8. СОРТИРОВКА ........................................................................ 163
Сортировка одного массива за один раз .................................. 163
Натуральный порядок сортировки............................................166
Сортировка нескольких массивов за один раз .........................167
Инвертирование массивов.......................................................167
Сортировка в случайном порядке.............................................168
5.9. РАБОТА СО ВСЕМ МАССИВОМ.................................................. 169
Вычисление суммы всех элементов массива ...........................169
Вычисление разницы между двумя массивами ........................170
Фильтрация элементов массива ..............................................170
5.1О. ИСПОЛЬЗОВАНИЕ МАССИВОВ ............................................... 171
Множества ...............................................................................171
Стеки .......................................................................................172
5.11. ИНТЕРФЕЙС ITERATOR .......................................................... 173

ГЛАВА 6. ОБЪЕКТЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
6.1. ТЕРМИНОЛОГИЯ И ОСНОВНЫЕ ПОНЯТИЯ .................................. 177
6.2. СОЗДАНИЕ ОБЪЕКТА .............................................................. 178
6.3. ДОСТУП К СВОЙСТВАМ И МЕТОДАМ ......................................... 179
6.4. ОБЪЯВЛЕНИЕ КЛАССА............................................................ 180
Определение методов .............................................................181
Объявление свойств ................................................................184
Перегрузка ..............................................................................185
Объявление констант ............................................................... 186

,.

Наследование .......................................................................... 186
Интерфейсы ............................................................................187

..... - - - - ......

-����-��'-·�

�·�: �·: :·:
·_·:

:·:

:·: �·: :·:: ·_·: �·: :·: :·:: :·: :·::·.·: ·_·: :·� :·:: ·_·: :·: :·:.;

:·.·: �·� :·_·:

РНР. Полное руководство и справочник функций

Абстрактные методы ................................................................ 192
Конструкторы........................................................................... 193
Деструкторы ............................................................................ 194
6.5. ИНТРОСПЕКЦИЯ .................................................................... 195
Исследование классов ........................................................... :. 195
· Исследование объекта ............................................................. 197
Пример интроспекции ............................................................. 198
6.6. СЕРИАЛИЗАЦИЯ ................................................................... 201

ГЛАВА 7. WEB-ТЕХНОЛОГИИ ...................... 206
7.1. ОСНОВЫ НПР....................................................................... 206
7.2. ПЕРЕМЕННЫЕ ....................................................................... 207
7.3. ИНФОРМАЦИЯ СЕРВЕРА ......................................................... 208
7.4. ОБРАБОТКА ФОРМ................................................................. 210
Методы .................................................................................... 210
Параметры............................................................................... 211
Самообработка страниц .......................................................... 213
Липкие формы ............................................ : ............................ 215
Многозначные параметры........................................................ 216
Липкие многозначные параметры ............................................ 218
Загрузка файлов ...................................................................... 220
Проверка формы...................................................................... 221
7.5. УСТАНОВКА ЗАГОЛОВКОВ ОТВЕТА............................................ 224
Разные типы контента .............................................................. 224
Перенаправления .................................................................... 225
Срок истечения ........................................................................
·
225
Аутентификация ....................................................................... 226
7.6. ПОДДЕРЖАНИЕ СОСТОЯНИЯ ................................................... 227
7.6.1. Использование Cookies .................................................. 228
7.6.2. Сессии ........................................................................... 232

..

Основы сессий.............................. : .......................................... 232
. Альтернативы Cookies .............................................................. 234
Пользовательское хранилище.................................................. 235

.



- -- - - -- - - - - - - - - - - - - - - - -- - - - . - - -- - - -- - -- - -- - - - -... - ... - - - - -- - -.. -... -... - -- - ----.:

Содержа ни
Комбинирование Cookies и сессий .......................................... 235
SSL .......................................................................................... 236

ГЛАВА 8. БАЗЫ ДАННЫХ ........................... 238
8.2. РЕЛЯЦИОННЫЕ БАЗЫ ДАННЫХ И SQL ....................................... 239
8.2.1. Введение в реляционные базы данных и SQL.. :............... 239
8.2.2. Объекты данных РНР ...................................................... 241
Создание соединения .............................................................. 242
Взаимодействие с базой данных.............................................. 242
Подготовленные запросы ........................................................ 242
Транзакции .............................................................................. 244
8.3. ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ИНТЕРФЕЙС MYSQLI ................. 244
8.4. SQLITE ................................................................................. 247
8.5. РАБОТА С ДАННЫМИ ЧЕРЕЗ ПРЯМОЕ
МАНИПУЛИРОВАНИЕ ФАЙЛАМИ ......................................... 250

ГЛАВА 9. ГРАФИКА ................................... 260
9.1. ВСТРАИВАНИЕ ИЗОБРАЖЕНИЯ В СТРАНИЦУ .••.•..................••..... 260
9.2. ОСНОВНЫЕ КОНЦЕПЦИИ ГРАФИКИ•••..•.••.......•...............•.......... 261
9.3. СОЗДАНИЕ И РИСОВАНИЕ ИЗОБРАЖЕНИЙ ••••...••..•.••..••••.•.......•.• 262
9.4. ИЗОБРАЖЕНИЯ С ТЕКСТОМ ......................••.•.••.••....•.••••........... 268
9.5. ДИНАМИЧЕСКИЕ СГЕНЕРИРОВАННЫЕ КНОПКИ ...•.••••......••••.•..••• 272
9.6. ИЗМЕНЕНИЕ РАЗМЕРА ИЗОБРАЖЕНИЙ ..............•.•••.••.•..•.......•.. 276
9.7. ОБРАБОТКА ЦВЕТА.....•.•...................•....•••..••..................•.••••.• 277

ГЛАВА 10. PDF ...................·...................... 283
1О.1. РDF-РАСШИРЕНИЯ ...••.•.......••.............•.•.••.•••••••.....•.••........... 283

...

10.2. ДОКУМЕНТЫ И СТРАНИЦЫ ............••......••••.••••.••...•.•.•••.....•.... 283

•:...·.· - - ------

.. - - -- - ............. -- - -..... - ......... ---- . -..... - -

---- - ----.... - -

РНР. Полное руководство и справочник функций

ГЛАВА 11 . XML ........................................ 286
11.1. КРАТКОЕ РУКОВОДСТВО ПО XML ............................................ 286
11.2. СОЗДАНИЕ ХМL-ДОКУМЕНТОВ............................................... 288

ГЛАВА 12. БЕЗОПАСНОСТЬ ........................ 291
12.1. ФИЛЬТРУЕМ ВВОД ............................................................... 291
12.2. МЕЖСАЙТОВЫЙ СКРИПТИНГ ................................................. 294
12.3. ЭКРАНИРОВАНИЕ ВЫВОДА.................................................... 297
12.3.1. Экранирование как инструмент соответствия
контексту .............................-.................................................... 297
12.3.2. Имена файлов .............................................................. 302
Основные проблемы безопасности, связанные
с именами файлов ................................................................... 302
Проверка относительных путей ................................................ 303
12.4. ФИКСАЦИЯ СЕССИИ ............................................................. 304
12.5. БЕЗОПАСНАЯ ЗАГРУЗКА ФАЙЛОВ........................................... 304
Не доверяйте предоставленным браузером именам файлов ... 305
Остерегайтесь заполнения вашей файловой системы ............. 305
Осторожно! register_globals ......................................... :········..··305
12.6. ДОСТУП К ФАЙЛАМ .............................................................. 306
Ограничиваем доступ к файловой системе .............................. 306
Используйте umask() ................................................................ 307
Вообще не используйте файлы ................................................ 308
Файлы сессии ..... � .................................................................... 308
Прячем библиотеки РНР .......................................................... 309
12.7. ЗАПУСК ПОЛЬ ЗОВАТЕЛЕМ РНР-КОДА ..................................... 310
12.8. КОМАНДЫ ОБОЛОЧКИ .......................................................... 311
12.9. РЕЗЮМЕ ............................................................................ 312

ПРИЛОЖЕНИЕ.
СПРАВОЧНИК ПО ФУНКЦИЯМ .............313



88·----···-········-· -·········-· ·-·..··········-·-----·····--·.··--···········--··:•

Глава 1. Введение в РНР
РНР - это простой, но в то же время очень мощный язык программиро­
вания, разработанный для создания НТМL-содержимого. В данной главе
мы с вами познакомимся с окружением этого языка, вы узнаете его при­
роду, историю, а также получите информацию о том, на каких платформах
он запускается и как его настроить. В завершении этой главы вы увидите
РНР в действии: мы рассмотрим несколько РНР-программ, иллюстрирую­
щих решение общих задач, например, обработку данных формы, взаимодей­
ствие с базой данных и создание графики.

1.1. Что делает РНР?
РНР можно использовать тремя основными способами:
• Сценарии сервера - изначально РНР разработан для создания дина­
мического веб-контента на стороне сервера, и это до сих пор являет­
ся самой сильной стороной РНР. Для генерации НТМL-кода вам ну­
жен синтаксический анализатор РНР и веб-сервер, с помощью ко­
торого можно отправлять получившиеся документы браузерам кли­
ентов. Кроме того, РНР так же стал популярным для генерации
ХМL-документов, графики, Flаsh-анимации, РDF-файлов и многого
другого.
• Сценарии командной строки - РНР может выполнять сценарии из ко­
мандной строки, во многом как Perl, awk, или оболочка Unix. Вы мо­
жете использовать сценарии командной строки для задач системно­
го администрирования, таких как резервное копирование и парсинг
журнала.
• Клиентские приложения с графическим интерфейсом пользователя используя PHP-GTK 1 , вы можете написать кросс-платформенное
приложение, обладающие графическим интерфейсом пользователя
(GUI), на РНР.

'В 2015 г., после довольно продолжительного перерыва была возобновлена работа над рас­
ширением PHP-GTK.

'-----------.......... --.---· ... -.-. -. ·-----· .. ----. ------· ... -.--·-.. ----....... ·811

РНР.

Полное руководство и справочник функций

В этой книге, однако, мы сконцентрируемся на первом способе применения
РНР: использование РНР для разработки динамического веб-контента.
РНР работает на всех основных операционных системах, от вариантов Unix,
в том числе Linux, FreeBSD, Ubuntu, DeЬian и Solaris до Windows и Мае OS
Х. Он может использоваться со всеми основными веб-серверами, в том числе Apache, Microsoft IIS и серверы Netscape/iPlanet.
Сам язык чрезвычайно гибок. Например, вы не ограни:1ены выводом про­
сто HTML или других текстовых файлов - вы можете генерировать доку­
менты любого формата. РНР имеет встроенную поддержку вывода файлов
PDF, изображений GIF,JPEG, PNG, Flаsh-роликов.
Одним из наиболее значительных качеств РНР является всесторонняя под­
держка баз данных. РНР поддерживает все основные базы данных (включая;
MySQL, PostgreSQL, Oracle, Sybase, SQL MS, DB2 и ОDВС-совместимые
базы данных), а так же многие другие. Также поддерживаются NoSQL-бaзы
данных, такие как SQLite и MongoDB. В общем, с использованием РНР
создание веб-страниц с динамическим контентом, полученным из базы дан­
ных, является достаточно простым.
Наконец, РНР предоставляет библиотеку уже готового РНР-кода для вы­
полнения общих задач, например, для абстракции базы данных, обработ­
ки ошибок и т.д. Эта библиотека называется РНР Extension and Application
Repository (PEAR). По своей сути PEAR - это платформа и система управ-.
ления для повторно используемых компонентов РНР. Подробно о PEAR вы
можете узнать по адресу: http://pear.php.net.

1.3. Установка РНР
Как был упомянуто выше, РНР доступен для многих операционных систем
и платформ. Вам нужно перейти по ссылке http://www.php.net/manual/
ru/install.php, найти среду, которая наиболее близко соответствует той, ко­
торая будет у вас использоваться, и следуовать надлежащим инструкциям.
Время от времени вам может понадобиться изменить стандартную конфи­
гурацию РНР. Чтобы сделать это, вы должны будете изменить конфигура­
ционный файл РНР и перезапустить ваш веб-сервер Apache. Каждый раз,
когда вы вносите изменения в среду РНР, вы должны перезапускать сер­
вер Apache, чтобы внесенные изменения вступили в силу.

..

Конфигурация РНР хранится в файле php.ini. Параметры в этом файле
определяют поведение РНР-функций, например, обработку сессий и форм.
В последующих главах мы будем ссылаться на некоторые опции файла php.

--

--

. - - - - - - - - - - -- - - - - - - - - - - - - --- - - - - - - - -- - - - - - - - - - -

-- - - -- - - - - - - - - -- - -- -- -- - - - - -

_,

Глава 1. Введение в РНР

ini, но в целом код из этой книги не требует какой-то особой настройки РНР.
За более подробной информацией о файле php.ini можно обратиться к сле­
дующей ссылке: http://php.net/rnanual/configuration.file.php.

1.4. Обзор РНР
Страницы РНР - это обычно НТМL-страницы со встроенными в них РНР­
командами. Во многом это отличает РНР�страницы от других динамиче­
ских решений, которые являются сценариями, с " method="GEТ ">
Температура в Фаренгейтах:






Последнее требование: у правильно оформленного документа есть только
один корневой элемент (стоящий на верхнем уровне иерархии). Например,
следующий документ правильно сформирован:


Программирование на PHP
Программирование на Perl
Программирование на C#


А следующий ХМL-документ сформирован нехорошо, поскольку на вер­
шине иерархии находятся сразу три элемента:

Программирование на PHP
Программирование на Perl
Программирование на C#

Определенные теги, атрибуты и сущности в ХМL-документе, а также пра­
вила, как они должны быть вложены, определяют структуру документа. Су­
ществует два способа записи этой структуры: определение типа документа
(DTD, Document Туре Definition) и схема (schema). Определения типа до­
кументов и схемы используются для проверки документа, чтобы гаранти­
ровать, что документ соответствует правилам для своего типа документа.

'-------

---- - - -------· ----..-----·-.. ---------------.-----.. - ·---· -.. ---- -.. ---�

--

РНР. Полное руководство и справочник функций

Большинство ХМL-документов не включают DTD - в этих случаях доку­
мент считается допустимым, если он содержит допустимый ХМL-код. Дру­
гие задают DTD как внешнюю сущность строкой, содержащей имя и распо­
ложение (файл или URL) DTD:


Иногда удобно инкапсулировать один ХМL-документ в другой. Например,
у ХМL-документа, представляющего почтовое сообщение, может быть эле­
мент attachment, который окружает прикрепленный файл. Если прикре­
пленный файл - XML, он является вложенным ХМL-документом.
Что если у документа почтового сообщения есть элемент body ( тема сооб­
щения) и у присоединенного ХМL-файла также есть элемент body, но у по­
следнего элемента полностью другие DТD-правила? Эта проблема решает­
ся использованием пространств имен. Пространства имен позволяют вам
квалифицировать ХМL-теги, например, email:body и human:body.

11.2. Создание ХМL-документов
Вы можете использовать РНР как для генерации динамическог_о HTML,
так и для генерации XML. Поскольку XML является общим форматом, на
РНР вы можете генерировать XML для самых разных программ, например,
использующих формы, запросы к базе данных и проч. Так, одним из прило­
жений XML является в RSS (Rich Site Summary) - формат, используемый
в новостных лентах. Вы можете читать информацию новостных статей из
базы данных или HTML и генерировать сводный ХМL-файл на основании
этой информации.
Генерировать ХМL-документ из РНР предельно легко. Просто измените
МIМЕ-тип документа, используя функцию header{), на "text/xml", а затем вы­
ведите ХМL-код с помощью конструкции echo:
echo '';

Пример 11.1 создает RSS-документ, используя РНР. RSS-файл представля­
ет собой ХМL-документ, содержащий несколько элементов channel, каждый
из которых содержит некоторые новостные элементы item. Каждый элемент
item имеет заголовок, описание и ссылку на саму статью. Формат RSS под­
держивает гораздо больше свойств item, чем используется в примере 1.1, но

ED.. ·--. -----..... ·-----------.------------. -. ·----·------..-------------... -------:•

Глава 11. XML

для простоты нам достаточно и этих трех. Для создания самого ХМL-кода,
как и для создания НТМL-кода, · не требуются какие-либо специальные
функции, просто выводим код с помощью echo .

...•.................•...........................
: Пример 11.1. Создание ХМL-документа :
....•..............•....•......••••••...•..•.•.•


htmlentities($_POST['username'], ENT_QUOTES, 'UTF-8'),
);
echo $html['username'];

В дополнение вы должны всегда фильтровать получаемые скриптом дан­
ные, и фильтрация должна -быть достаточно избыточной. Например, если
вы должны проверять имя пользователя, чтобы убедиться, что оно содер­
жит тольк алфавитные символы. Также полезно фильтрова,ть вывод. Если
все делать грамотно, то никакая ХSS-атака вам не страшна.

SQL-инъекция
Второй наиболее часто встречающейся уязвимостью веб-приложений явля­
ется SQL-инъекция. Данная атака, очень похожа ХSS-атаку: злоумышлен­
ник встраивает вредоносный код в SQL-зaпpoc к базе данных. Опасность
SQL-инъекции существует, если вы используете неэкранированные данные
в вашем SQL-зaпpoce (по аналогии с SQL-инъекцией, XSS можно было бы
назвать НТМL-инъекцией). При этом для тех баз данных, которые поддер­
живают выполнение несколько запросов в одном пакете, злоумышленник
может исполнить запрос удаляющий или изменяющий данные.
Следующий пример демонстрирует SQL-инъекцию:
$hash = hash($_POST['password']);
$sql = "SELECT count(*) FROM users
WHERE username = ' { $_POST['username']}' AND password = ' { $hash} '";
$result = mysql_query($sql);

Проблема заключается в том, что без экранирования username значение
данной переменной может изменять формат SQL-зaпpoca. Поскольку эта
уязвимость настолько часта, многие злоумышленники пытаются войти на
сайт, используя примерно такие имена пользователей:

•:------··-···------·······-------------··---------------··-------······------------chris' --

РНР. Полное руководство и справочник функций

Я часто шучу, что это мое любимое имя пользователя, поскольку оно позво­
ляет получить доступ к учетной записи пользователя chris без знания па­
роля этой учетной записи. После интерполяции SQL-зaпpoc будет иметь
вид:
SELECT count(*)
FROM users
WHERE usernome = 'chris' --'
AND possword = ' ... "';

Поскольку два последовательных дефиса (--) означают начало SQL­
комментария, этот запрос идентичен следующему:
SELECT count(*)
FROM users
WHERE usernome = 'chris'

Если код, содержащий этот фрагмент кода, подразумевает успешный вход
в систему, когда $result не равен О, эта SQL-инъекция позволила бы ата­
кующему входить в систему с любой учетной записью без необходимости
знать пароль.
Для защиты от SQL-инъекций нужно опять использовать экранирование:
$mysql = orroy();
$hosh = hosh($_POST['possword']);
$mysql['usernome'] = mysql_reol_escape_string($cleon['usernome']);
$sql = "SELECT count(*) FROM users
WHERE usernome = '{ $mysql['usernome']}' AND possword = ' { $hosh} "';
$result = mysql_query($sql);

Однако, это гарантирует только, что экранировщшые вами данные будут
интерпретироваться, как данные. Но вам все еще нужно фильтровать дан­
ные, поскольку некоторые символы вроде знака % имеют специальное зна­
чение в SQL, но они не нуждаются в экранировании.
Лучшая защита от SQL-инъекции - это использование связанных параме­
тров (Ьоund-параметров). Следующий пример демонстрирует пример ис­
пользования таких параметров с расширением PDO и базой данных Oracle:
$sql = $db->prepore("SELECT count(*) FROM users
WHERE usernome = :usernome AND possword = :hosh");
$sql->ЬindPorom(":usernome", $cleon['usernome'], PDO::PARAM_STRING, 32);
$sql->ЬindPorom(":hosh", hosh($_POSТ['possword']), PDO::PARAM_STRING, 32);

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



ВI---------------------------------------------------------------------------------:

Глава 12. Безопасност

12.З. Экранирование вывода
12.3. 1 . Экранирование как инструмент соответствия
контексту
Экранирование - это техника, предотвращающая использование данных
в другом контексте. Например, в HTML некоторые символы имеют особый
смысл и должны быть представлены в виде НТМL-сущностей, чтобы сохра­
нить их значение, то есть их значение должно соответствовать контексту.
Это особенно важно на фоне того, что РНР часто используется как мост
между разными источниками данных, поэтому когда вы отправляете дан­
ные удаленному получателю, ваша обязанность - подготовить их должным
образом так, чтобы они были интерпретированы так, как нужно, и исполь­
зованы по назначению. Например, строка Д'Артаньян должна быть представ­
лена как Д\'Артаньян когда используется в SQL-зaпpoce, отправленном в базу
данных MySQL. Обратный слеш перед одинарной кавычкой заставляет
одинарную кавычку находиться в контексте SQL-зaпpoca: здесь одинарная
кавычка - это часть данных, а не часть запроса, и экранирование гарантиру­
ет эту интерпретацию.
Веб-приложения, написанные на РНР, в ходе своей работы обычно от­
правляют данные двум основным пунктам назначения: во-первых, НТТР­
клиентам (веб-браузерам), интерпретирующих HTML, JavaScript и дру­
гие клиентские технологии, а во-вторых, базам данных, которые интерпре­
тируют SQL-запросы. Для первого случая РНР предоставляет функцию
htmlentities(), которая преобразует все возможные символы в соответству­
ющие НТМL-сущности:
$html = array();
$html['username'] = htmlenlilies($clean['username'], ENT_QUOTES, 'UTF-8');
echo "Добро пожаловать, { $html['username']} . < /р>";

Данный пример демонстрирует еще одно соглашение использования имен.
Массив $html по сути это тот же массив $clean, за исключением того, что
теперь данные представлены в виде, безопасном для использования в кон­
тексте HTML.
URL иногда встраиваются в HTML как ссылки:
<

а href="http://host/script.php?var={ $value} ">Щелкните здесь

В данном конкретном примере $value существует внутри вложенного кон­
текста: когда один контекст вложен в другой контекст. И действительно,
с одной стороны $value находится внутри контекста строки URL, а с дру­
гой стороны - внутри НТМL-контекста как ссылка. Поскольку в этом слу-

,_ ----

.. -- ------- ---- -- - -----.... -- - ---- -.... ·- ---- -- - - -· -. -....... -- - --.. -.. -·

---

РНР. Полное руководство и справочник функций

чае она алфавитная, то есть не содержит каких-либо специальных симво­
лов, то ее безопасно использовать в обоих контекстах без экранирования.
Однако, когда вы не можете гарантировать корректное соответствие кон­
тексту (значение $var не может быть безопасным в каком-либо контексте),
значение должно экранироваться каждый раз для каждого контекста: в на­
шем примере оно должно быть экранировано дваждьi:
$url = array(
'value' => urlencode($value),
);
$link = "http://host/script.php?var={ $url['value']}";
$html = array(
'link' => htmlentities($link, ENT_QUOTES, 'UTF-8'),
);
echo "Щeлкнитe здесь";

Таким образом вы гарантируете, что ссылка может безопасно использовать­
ся и в НТМL-контексте HTML и в URL-контексте когда пользователь щел­
кает по ней (первое URL-кодирование (по сути экранирование) гарантиру­
ет, что значение $var будет сохранено).
Для большинства баз данных существует "родная" функция экранирова­
ния, специфичная для этой базы данных. Например, расширение MySQL
предоставляет функцию mysqli_real_escape_string{):
$mysql = array(
'usernam�• => mysqli_real_escape_string($clean['username']),
);
$sql = "SELECT * FROM profile
WHERE username = '{ $mysql['username']}'";
$result = mysql_query($sql);

Более безопасная альтернатива - использовать абстрактную библиотеку баз
данных, которая управляет экранированием для вас. Следующий пример
иллюстрирует данную концепцию с PEAR::DB:
$sql = "INSERT INTO users (last_name) VALUES (?)";
$db->query($sql, аггау($clean['last_name']) );

Хотя это не полный пример, он демонстрирует использование заполните­
ля (вопросительного знака) в SQL-зaпpoce. Здесь PEAR::DB должным обра­
зом экранирует данные в соответствии с требованиями вашей базы данных.
Более полное экранирование вывода включало бы экранирование НТМL­
элементов, НТМL-атрибутов,JаvаSсriрt-кода, CSS и URL. Пример 12.1 со­
держит демонстрационный класс, предназначенный для экранирования

ВI--...................---· ...........---------..------------.--.------------..----'

Глава 12. Безопасность

вывода в различных контекстах на основании правил экранирования кон­
тента, подготовленных проектом Open Web Application Security Project.
Пример 12. 1 . Экранирования вывода дnя разных контекстов
class Encoder
const ENCODE_SТYLE_НТML = О;
const ENCODE_SТYLE_JAVASCRIP T = 1;
const ENCODE_SТYLE_CSS = 2;
const ENCODE_SТYLE_URL = З;
const ENCODE_SТYLE_URL_SPECIAL = 4;
private static $URL_UNRESERVED_CHARS =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxyz-_. ~•;
puЬlic lunction encodeForHTML($value)

{

$value = str_replace('&', '&amp;', $value);
$value = str_replace('', '&gt;', $value);
$v�lue = str_replace("", '&quot;', $value);
$value = str_replace('\", '&#х27;', $value);
// &apos; не рекомендуется
$value = str_replace('/', '&#x2F;', $value);/ / прямой слеш может помочь
//завершить НТМL-сущность
return $value;

puЬlic funclion encodeForHTMLAttribute($value)
{

return $this->_encodeString($value);

puЬlic lunction encodeForJavascript($value)
{

return $this->_encodeString($value, self::ENCODE_SТYLE_JAVASCRIPT);

puЬlic lunction encodeFor_URL($value)
{

.

return $this->_encodeString($value, self::ENCODE_SТYLE_URL_SPECIAL);

puЬlic lunction encodeForCSS($value)
{

relurn $this->_encodeString($value, self::ENCODE_SТYLE_CSS);

: .. ·-------········-····---·······-··---···--··········--········-·-·····---·-----&1

РНР. Полное руководство и справочник функций
/**
* Кодирует любые специальные символы в пути URL. Не изменяет прямой слеш,
* используемый для обозначения каталогов. Если ваши имена каталогов содержат
* слеши (редко), и·спользуйте urlencode но каждом компоненте каталога и затем
* соедините их вместе с помощью прямого слешо.
*
* Основано но http://en.wikipedio.org/wiki/Percent-encoding и
* http://tools.ietf.org/html/rfc3986

*/

puЬlic function encodeURLPoth($volue)
{

$1ength = mb_strlen($value);
if ($1ength == О) {
return $volue;

$outpul = ";
for ($i = О; $i < $1ength; $i++) {
$chor = mb_substr($volue, $i, 1 );
if ($chor == '/') {
// слеши разрешены в путях
$output .= $chor;

}
else if (mb_strpos(self::$URL_UNRESERVED_CHARS, $chor) == folse) {
// Не находится в незорезервировонном списке, поэтому
// будет закодировано
$output .= $this->_encodeChorocter($chor, self::ENCODE_SТYLE_URL);

}
else {
//Символ находится в незорезервировонном списке, поэтому пропускаем его
$output .= $chor;

relurn $output;

privote function _encodeString($volue, $style = self::ENCODE_SТYLE_НТML)
{

if (mb_strlen($volue) == О) {
return $volue;
$chorocters = preg_split('/(?
ServerName domainA.com
DocumentRool /web/siles/domainд
php_admin_value open_basedir /web/siles/domainд


Аналогично, вы можете настроить ее отдельно для каждого каталога или
URL в вашем файле httpd.conf:
# no каталогу

php_admin_value open_basedir /home/httpd/html/арр 1

# по URL

php_admin_value open_basedir /home/httpd/html/арр2


Директива open_basedir может быть установлена только в файле httpd.
conf, а не в файле .htaccess, и вы должны использовать опцию php_admin_
value для установки open_basedir.
Используйте umask()
Плохо сначала создавать файл, а затем устанавливать права доступа к нему.
Это создает возможность "везучему" пользователю получить доступ к фай­
лу до того, как будут изменены права доступа, и доступ к файлу ему будет
заблокирован. Вместо этого используйте функцию umask{), изначально от­
секающую ненужные права. Например:

'--------------------------------------------------------------------------�------ID

РНР. Полное руковuдство и справочник функций

umask(077);
//отключаем ---rwxrwx
$fh = fopen("/tmp/myfile", 'w');

По умолчанию функция fopen() пытается создать файл с
(rw-rwrw-). Вызвав сначала umask(), вы отключите биты
и других пользователей, оставив только 0600 (гw------).
вы вызовите fopen(), будет создан файл с установленными
(0600).

правами 0666
прав группы
Теперь, когда
вами правами

Вообще не используйте файлы
Поскольку все сценарии на компьютере выполняются от имени одного
и того же пользователя, файл, который был создан одним сценарием, может
быть прочитан другим сценарием, независимо от того, кто написал этот сце­
нарий. Все, что нужно знать сценарию - это имя файла.
От этого нельзя защититься, поэтому лучше всего не использовать файлы
для хранения данных, которые должны быть защищены, более безопасно
хранить данные в базе данных.
Более сложное решение заключается в запуске отдельного демона Apache
для каждого пользователя. Если вы добавите обратный прокси, например,
haproxy, перед пулом экземпляров Apache, вы сможете обслужить более 100
пользователей на одной машине. Однако такое решение довольно редко ис­
пользуется из-за его сложности и стоимости по сравнению с обычной ситу­
ацией, где один демон Apache может обслужить тысячи пользователей.

Файлы сессии
При использовании встроенной в РНР поддержке сессий, информация
о сессии сохраняется в файлах. Каждый файл называется /tmp/sess_id,
где id - имя сессии, обычно владелец этих файлов пользователь nobody
(пользователь, под которым работает веб-сервер).
Поскольку все РНР-сценарии, как мы уже говорили, выполняются от име­
ни одного и того же пользователя, это означает, что любой РНР - сценарий,
размещенный на сервере, может прочитать любые файлы сессий для других
сайтов на этом сервере. В ситуациях, когда ваш РНР-код хранится на серве­
ре хостинг-провайдера, который совместно используется РНР-сценариями
еще других пользователей, переменные, которые вы храните в своих сеан­
сах, видимы другим сценариям РНР. Что еще хуже, другие пользователи
сервера могут создать файлы в каталоге сессии /tmp. В результате пользо­
ватель может создать поддельный файл сессии, в котором будут любые пе­
ременные и значения, которые он захочет видеть в нем. И ничто ему в этом
не помешает. Так, пользователь через свой браузер может отправить ваше­
му сценарию cookie с именем фальшивой сессии и ваш сценарий благопо-

lD------------------.---------------------------..--..... ------.-......----.. ----. '

Глава 12. Безопасность

лучно загрузит переменные, сохраненные в поддельном файле сессии, кото­
рый до этого был помещен в каталоге сессии.
Вы можете попросить вашего провайдера настроить сервер так, чтобы ваши
файлы сессии хранились в вашем собственном каталоге. Обычно для этого
в блоке VirtualHost в конфигурационном файле Apache (httpd.ini) созда­
ется строка:
php_value session.save_path /some/path

Если у вас есть самих доступ к файлу .htaccess, и ваш Apache позволяет пе­
реопределять настройки, вы можете внести необходимые изменения само­
стоятельно.

Прячем библиотеки РНР
Достаточно много информации о слабых местах вашего сервера можно по­
черпнуть, загрузив include-фaйлы или какие-либо данные (файлы), кото­
рые хранятся рядом с HTML и РНР-файлами в корневом каталоге доку­
ментов веб-сервера. Чтобы предотвратить это, вам нужно хранить библи­
отеки кода и данные за пределами корневого каталога документов сервера.
Например, ·если корневым каталогом является /home/httpd/html, все, что
находится в этом каталоге, может быть загружено через URL. Просто по­
местите код вашей библиотеки, конфигурационные файлы, журналы и дру­
гие данные за пределами указанного каталога (например, в /usr/local/lib/
туарр). Конечно, это не гарантирует, что кто-либо из д'ругих пользователей
сервера не получит незаконный доступ к этим файлам (см. "Не используй­
те файлы"), но это по крайней мере предотвратит то, что данные файлы мо­
гут быть загружены удаленными пользователями.
Если вы по каким-либо причинам все-таки должны хранить некоторые
вспомогательные файлы в своем корневом каталоге документов, то в таком
случае вы должны настроить веб-сервер так, чтобы он отклонял запросы
к этим файлам. Например, следующий пример указывает Apache отклонять
запросы доступа к любому файлу с расширением .inc, которое чаще всего
используется для include-фaйлoв в РНР:

Огdег allow,deny
Deny from all


Но самый лучший способ предотвратить загрузку файлов с исходным ко­
дом РНР - это всегда использовать расширение .php.
Если вы, как мы рекомендовали выше, храните библиотеки кода в дру­
гом каталоге, вам нужно указать РНР, где их следует искать. Укажите путь

' ----------..... ---.. --. -----------........ --.-. -.... -.... ---. ----. -----...-..... 1D

РНР. Полное руководство и справочник функций

к ним в каждой функции include() или require(), или же измените пара­
метр include_path в php.ini:
include_path = ".:/usr/local/php:/usr/local/lib/myapp";

12. 7. Запуск пользователем РНР-кода
С помощью функции eval(} РНР позволяет выполнять произвольный
РНР-код. Хотя это может быть полезно в нескольких случаях - позволить
пользователю выполнять любой код с помощью eval(), ·· тем самым вы
подвергаете свою систему существенному риску. Например, следующий
код - настоящий кошмар любого, кто думает о безопасности, и находнка для
тех, кто хочет сделать с вашим сайтом все, что захочет: