|
||||||||||||||||||||||||||||||||||||||||||
Основы web-программирования для школьного "сайтостроительства". Лекция 4."Позвольте, товарищи, у меня все ходы записаны!"И снова здравствуйте, уважаемые коллеги! Основной технической темой четвертой лекции нашего курса станет обработка файлов на PHP. Хотя в настоящее время работать с файлами напрямую приходится не слишком часто — для хранения и обработки данных преимущественно используются СУБД, иметь представление об основных функциях для манипуляций с файлами полезно. Начнем с того, что рассмотрим классическую задачу web-программирования — организацию гостевой книги на сайте. Учебный план
Мини-проект “Гостевая книга”Этот проект мы разместим в каталоге /home/guestbook/www. Если Denwer у вас уже запущен, пожалуйста, остановите его и создайте требуемый каталог. В этот каталог поместите два файла — guestbook.php и guestbook.txt. В первом файле будет находиться скрипт гостевой книги, во втором — содержимое книги — записи, оставленные пользователями. Второй файл guestbook.txt в начальный момент времени надо будет только создать и оставить пустым. А скрипт guestbook.php должен быть таким: <?php if (isset($send)) { $f=fopen("guestbook.txt","a"); fwrite($f,"<p><code>".date("j.m.Y в H:i"). " <b>$author</b> написал</code>:\n<br>$message\n\n"); fclose($f); } ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1251"> <title>Гостевая книга</title> </head> <body> <h1>Гостевая книга</h1> <hr> <form action="guestbook.php" method="post"> <p><input name="author" type="text" size="30" value="Пожалуйста, представьтесь"> <p><textarea name="message" cols="60" rows="10"> Здесь вы можете оставить свое сообщение </textarea> <p><input name="send" type="submit" value="Отправить!"> </form> <hr> <?php include "guestbook.txt"; ?> </body> </html> Если вы сделали все правильно, то гостевая книга должна сразу же заработать. Попробуйте: введите несколько записей. У вас должно получиться что-то похожее на рис. 1.
Рис. 1 После добавления нескольких записей в гостевую книгу посмотрите на файл guestbook.txt, чтобы убедиться в том, что именно в него записи и добавляются. Например, у меня этот файл имеет следующий вид: <p><code>21.09.2008 в 13:00 <b>Сергей Островский</b> написал</code>: <br>Первая запись в гостевой книге <p><code>21.09.2008 в 13:01 <b>Вася</b> написал</code>: <br>Здесь был Вася Разберем скрипт гостевой книги. Прежде всего удивление может вызывать то, что этот скрипт один. То есть в данном случае… Форма и обработчик совмещены в одном файлеНа самом деле именно так обычно и делают. Все примеры предыдущей лекции, в которых формы и обработчики были размещены в разных файлах, были написаны таким образом исключительно из соображений наглядности. На практике форму и скрипт обработчика чаще всего размещают в одном файле, как и сделано в этом примере. Логика работы скрипта-обработчика в этом случае следующая: он проверяет, переданы ли ему параметры из формы. Если переданы — необходимо выполнить обработку и затем вывести форму. Если параметров нет — просто вывести форму. Как проверить, переданы ли параметры? Тут есть несколько вариантов. Я применил способ, который мне кажется наиболее наглядным, — с использованием функции isset, рассмотренной в прошлой лекции. Работает это так. В форме имеются три элемента управления — однострочное текстовое поле ввода, многострочное текстовое поле ввода и кнопка отправки данных с именами author, message и send соответственно. Можно проверить любую из этих переменных и, если переменная определена, считать, что скрипт вызван из формы (я проверил переменную send). Основные файловые операцииЕсли скрипт guestbook.php обнаруживает, что переменная $send определена, он дописывает в файл guestbook.txt очередное сообщение. При этом используется ряд файловых функций. Эти функции кратко рассмотрены в следующей таблице (в ней также упомянуты некоторые другие функции, которые могут нам понадобиться в дальнейшем, а также функции, которые уже встречались ранее в примерах).
Более подробную информацию об этих и других файловых функциях можно найти в документации по PHP, например, на странице http://ru2.php.net/manual/ru/ref.filesystem.php. Паранойя — профессиональная болезнь web-программистовЭто, конечно, шутка. Хотя… как посмотреть. Хороший web-программист в определенном смысле практически обязан быть параноиком, иначе его сайты долго не проживут. В частности, я хочу категорически предостеречь вас от того, чтобы уже сейчас начать размещать наши примеры, подобные приведенной гостевой книге, в настоящем Интернете. Для взлома подобных скриптов профессионалу потребуются секунды. Не верите? Давайте покажу :). В Denwer’е имеется слабая защита от некоторых видов взломов, которая ни на секунду не остановила бы меня как взломщика, но для противодействия ей мне потребовалось бы сделать примеры взломов чуть менее наглядными. Поскольку в данном случае моим приоритетом является именно наглядность (я ведь не читаю курс о технологиях взлома сайтов), давайте отключим эту “защиту”. Для этого, пожалуйста, сделайте следующее: 1. Остановите Denwer. 2. Найдите файл /usr/local/php5/php.ini (мы уже модифицировали этот файл ранее). 3. В строке 431 замените значение magic_quotes_gpc c On на Off. 4. Запустите Denwer. Все готово. Ломаем! Сначала бережно… Просто похулиганим. Добавьте в гостевую книгу сообщение, показанное на рис. 2a. Результат этого “доброго” взлома показан на рис. 2б. В данном случае “добрый хакер” не сделал ничего страшного, он просто несколько подпортил внешний вид страницы, поскольку вставил на страницу код на Javascript. Бывает хуже :).
Рис. 2a Рис. 2б А теперь взломаем по-настоящему. Жестко! Способ этого взлома и результат показаны на рис. 3а и 3б. Вам кажется, что на рис. 3б не показано ничего страшного? Вы жестоко ошибаетесь. Посмотрите-ка на содержимое файла guestbook.txt. То-то! Рис. 3a
Рис. 3б Администрирование школьной доски объявленийВернемся к школьной доске объявлений, которой мы занимались в лекции 2. Понятно, что между гостевой книгой и доской объявлений нет принципиальной разницы, и форму гостевой книги можно приспособить для администрирования объявлений. Напомню, что в лекции 2 мы значительно автоматизировали работу с объявлениями на школьном сайте, но для того, чтобы секретарь (например) мог самостоятельно манипулировать объявлениями, он должен был иметь доступ к соответствующему каталогу (каталогу notices). Это не только неудобно, но и небезопасно. Проще (для пользователя, разумеется!) предоставить секретарю удобный web-интерфейс, в котором он мог бы выполнять все необходимые операции с объявлениями — вводить новые, менять важность объявления и т.п. Пример такого web-интерфейса показан на рис. 4. Рис. 4 Рис. 5 По сравнению с возможностями, рассмотренными в лекции 2, в этом интерфейсе предусмотрена возможность “прятать” объявления. Потребность временно спрятать объявление, не удаляя его насовсем, возникает довольно часто. Технология ввода нового объявления посредством данного интерфейса следующая: надо, используя соответствующую ссылку, создать новое объявление-пустышку, которое будет создано заблокированным. Затем можно его отредактировать и, при необходимости, разблокировать. Страница редактирования объявления показана на рис. 5. Разумеется, код этого примера уже достаточно велик и печатать его не имеет смысла. Полный комплект соответствующих файлов можно взять на странице нашего курса на сайте Педуниверситета http://edu.1september.ru в разделе “Учебные материалы” (эти материалы находятся в открытом доступе, и с ними могут познакомиться не только слушатели курса, но и все читатели газеты). В файлах я подробно прокомментировал код всех примеров. Передача данных форм методами GET и POSTВозможно, вы обратили внимание на то, что в примере гостевой книги в теге форм был указан дополнительный параметр method="post". Если его не указать, то ничего страшного не произойдет, примеры будут работать. Различие же проявляется лишь в способе передачи параметров. При использовании метода POST строка URL выглядит “пустой” (убедитесь!). Параметры передаются серверу, но как — ни мы, ни пользователь не видят. Если же использовать метод GET — для этого надо указать method="post" или вовсе опустить параметр method — метод GET будет использоваться по умолчанию, мы увидим параметры, явно указанные в URL (см. рис. 6). Рис. 6 Русские буквы и специальные символы в строке URL кодируются шестнадцатеричными кодами. Если ввести сообщение английскими буквами, оно будет передано “AS IS”(“как есть”) (рис. 7). Рис. 7 Внутренние механизмы передачи параметров методами GET и POST, разумеется, существенно различаются (и, в общем случае, GET и POST не являются взаимозаменяемыми), но в объеме нашего курса можно считать, что различие между этими методами носит визуальный характер и не влияет на функциональность. Се. Ль. Островский | ||||||||||||||||||||||||||||||||||||||||||