Ваш первый Сайт С использованием РНР-скриптов
ОСНОВЫ БЕЗОПАСНОСТИ ДЛЯ САЙТА
В этой главе мы разработаем с вами еще одну страницу для сайта, на которую вы попадете, нажав на главной странице index.php надпись «Статьи». Создайте в рабочей папке htdocs подпапку statji. В эгу подпапку вы будете загружать любые статьи. В браузер будут выводиться название статьи, автор статьи. Дополнительно мы создадим книгу отзывов посетителей и создадим возможность посетителям оценивать страницу по пятибалльной шкале. Программы для книги отзывов и оценки страницы создадим универсальные, т. е. их можно будет использовать на любых страницах вашего сайта.
Теоретические знания, которые нам понадобятся в этой главе, у вас уже должны быть, если вы разобрались с предыдущими главами. Однако кое-что нам нужно еще усвоить.
В книге отзывов каждый желающий может оставить на странице свое сообщение, которое будет потом отображаться в браузере. Он указывает свои данные (имя, электронный адрес) и записывает свое сообщение в текстовую область формы. Затем эти данные будут обрабатываться, и если текстовая область не была пустой, сообщение с указанными данными посетителя, будет выведено в окно браузера. Создание книги отзывов не вызовет у вас затруднений, но есть некоторые нюансы. Какой-нибудь недоброжелатель, вместо своего имени, адреса или сообщения может отослать вредоносный код, написанный на языке php, perl, и т. п. Поэтому данные, введенные пользователем, мы должны обработать, а именно, теги, которые посетитель может ввести, должны быть удалены. При помощи тегов злоумышленник может ввести в текстовые поля код на php, html, JavaScript, VBScript, который может нанести вред вашей странице или даже всему вашему сайту. Напишем, к примеру, небольшой код. Создадим форму с простым текстовым полем и кнопкой «добавить». После отправки данных из формы на эту же страницу содержимое текстового поля отобразится в браузере. В общем-то, безобидный на первый взгляд код листинга 6.1.
Листинг 6.1 <?Php
$filen="test. txt";
If(!file_exists($filen))
{
$open=fopen($filen, "w");
Fclose($open); }
If(isset($_POST['imja']))
{
$imja=$_POST[4mja'l; $open=fopen($filen, "a+");
$rec=fwrite($open, "Здравствуй: ".$imja."<br>"); fclose(Sopen);
}
$open=fopen($filen, "a+"); $read=fread($open, 1000); fclose(Sopen); echo Sread;
Echo "<form action=obychenie2.php method=POST>"; echo "Ваше Имя: "."<input type=text name=imja><br>"; echo "<input type=SUBMIT Уа1Ие=Добавить>";
Echo "</form>";
?>
Я лишь вкратце разъясню этот код. Он должен быть вам понятен. Снача - ло проверим, существует ли файл test.txt (можете назвать его, как хотите). Если нет, а при самом первом запуске программы это действительно так, то создаем его. Далее проверяется, отправлены ли данные из формы, т. е. была ли нажата кнопка «добавить». Если это так, то в текстовый файл test.txt записывается содержимое текстового поля, которое было введено в форме. Далее открываем этот файл, считываем и выводим в браузер это содержимое. Кстати, содержимое текстового файла будет после выводиться в браузер и до ввода данных в форму, поскольку даже если условие if(isset($_POST['imja'])) Ложно (мы только запустили эту программу, но не ввели еще данные в форму), код после последней закрывающейся скобки будет выполняться.
Сохраните в рабочей папке htdocs и запустите эту программу. В текстовое поле введите любое имя, например «Иван». Нажмите на кнопку «добавить». Веденное имя отбразится в браузере, как показано на рис. 6.2. Кстати, если вы используете сейчас компьютер, не подключенный к Интернету, то после нажатия кнопки в форме может появиться предупреждение, подобное на рис. 6.1.
Это может появиться при использовании метода отправки в теге формы Method=POST. Если нажмете кнопку «Повтор», то данные будут отправлены повторно, в результате чего в текстовый файл эти данные будут записаны дважды, а в браузер выведется 2 раза имя «Иван». Лучше жмите «Отмена» Для возврата к странице, чтобы данные из формы не отправлялись повторно.
Microsoft Internet Explorer
-ч Не удается обновить страницу без повторной отправки данных. I л Нажмите соответствующую кнопку для повторной отправки данных или отмените операцию для возврата к открываемой странице.
|Повтор ] [ Отмена j
Рис. 6.1
Итак, после возврата к данной странице, вы увидите примерно так, как на рис. 6.2.
W Svoi. NET : РНР Edit [C:Home_serverApache2htdocsMyBookobychenie2.
РР Файл Редактор Вид Пуск Подсветка Закладки Вставка Помощь S Язык
BadJtV* » 4ii: а ^ rs1 у-■ s Л и - а.
(Щ Address: ^h«p://localhost/MyBook/obychenie2.php. v|
Здравствуй: Иван
Рис. 6.2
Теперь представьте, что некий Пупкин введет в текстовое поле следующее: <body bgcolor=black text=red>TIynKUH</body>.
Нажмите на кнопку «Добавить». Вся ваша страница станет черной, цвет текста красным. Перезапустите программу. Увы, дизайн так и остался измененным, поскольку введенный HTML-код, который устанавливает цвет фона и шрифта, будет теперь выполняться при каждой загрузке этой страницы, и дизайн может быть испорчен. И это еще меньшее из зол, что может сделать злоумышленник.
Избежать подобных действий со стороны «товарища Пупкина» поможет функция htmlspecialchars(). Эта функция заменяет все теги и обратные слеши на безопасные буквенно-символьные выражения (обратные слеши используются для программирования на Perl). Измените переменную $гес в листинге 6.1 следующим образом:
$rec=fwrite($open, "Здравствуй: ".htmlspecialchars($imja)."<br> ");
Снова запустите программу и опять введите в текстовое поле: <body bgcolor=black text=red>NymuH</body>.
В результате выполнения программы в окно браузера будет выведена приведенная выше строка. Теги выведутся тоже, но исполняться не будут! Если вы хотите, чтобы текст выводился определенного шрифта и цвета, ставьте нужные вам теги перед и после функции htmlspecialchars(). Например: $rec =fwrite($open, "Здравствуй: ". "<В style='color: #000066; font-family: Arial'> ".htmlspecialchars($imja). "</B><br> ");
Перед функцией htmlspecialchars($imja) при помощи соединительного оператора конкатенации (точки), в кавычках вставлен тег <В>, который подразумевает жирный текст. Кроме того, в этом теге определен стиль текста (вид шрифта Arial темно-синего цвета). После функции обязательно нужно поставить закрывающий тег </В>.
Снова запустите данную программу, напишите любое имя в текстовое поле формы и опять нажмите кнопку «Добавить». Имя будет выведено шрифтом Arial, темно-синего цвета.
Функцию htmlspecialcharsQ мы будем использовать и в дальнейшем, чтобы обеспечивать безопасность сайта от вводимых гользователями данных. Есть еще другая функция stripJags(), которая, в отличие от предыдущей функции, не заменяет, а удаляет все теги. Мы ее тоже будем применять на практике.