Уроки PHP для начинающих


Скрипт добавления комментариев на сайте: защищаемся от вредоносного кода + страховка от хостингов, не поддерживающих глобальные переменные

Теперь защитим скрипт от вредоносного кода. Собственно, на эту тему уже был урок, так что ничего нового здесь для вас нет. Но ведь повторение никому не вредило. А кроме того, здесь мы познакомимся с ещё одной фишкой. Но по порядку.

Ставим запрет на html и заменяем все спецсимволф их эквивалентами:

<?php
if (empty ($name) or empty ($email) or empty ($text)) //если перечисленные переменные отсутствуют
//выводим следующее сообщение
{
echo "Форма заполнена не полностью!";
exit (); //и останавливаем выполнение программы
}
if ($summa != 17)
{
echo "Сумма чисел с картинки указана не правильно!";
exit (); //и останавливаем выполнение программы
}
else
{
// ставим запрет на html-теги
$text = strip_tags ($text);
$email = strip_tags ($email);
$name = strip_tags ($name);

// заменяем все специальные символы их html-эквивалентом
$text = htmlspecialchars ($text);
$email = htmlspecialchars ($email);
$name = htmlspecialchars ($name);

$gbpath="gb.dat";// Путь к файлу с записями
if(!file_exists($gbpath))// проверяем есть ли файл $gbpath 
{
// если отсутствует, то создаем его
$f=fopen($gbpath,"w") or die ("Не могу создать файл"); // создание файла
flock($f,2) or die("Невозможно заблокировать файл"); // блокируем файл
fwrite ($f,"",0); // имитация записи в него
@chmod($f, 0664); // установка прав на запись
fclose($f); // Закрытие созданного файла
}
if(getenv("REQUEST_METHOD")=="POST"){// проверяем, если метод запроса POST
// то значит скрипт вызван формой записи сообщения
$f=fopen($gbpath,"r") or die("Не могу открыть файл"); // Открываем файл для чтения
$oldData = fread($f, filesize ($gbpath)); // считываем данные
fclose($f); // закрываем файл
$f=fopen($gbpath,"w+") or die("Не могу открыть файл"); // открываем файл для дописи
flock($f,2) or die("Невозможно заблокировать файл"); // блокируем файл
fputs($f,"$name\n"); // записываем имя автора
fputs($f,"$email\n"); // его e-mail
$text=ereg_replace("\n"," ",$text);// убираем возвраты каретки из сообщения
fputs($f,"$text\n"); // записываем сообщение
fwrite($f,$oldData); // записываем прежние данные
fclose($f); // закрываем файл
}
}
$f=fopen($gbpath,"r") or die("Не могу открыть файл");// открываем файл с записями
while(1){// вырожденный цикл, для чтения записей из файла
$name=fgets($f,1000);// считываем имя автора
$email=fgets($f,1000);// его e-mail
$text=fgets($f,1000);// сообщение
if(feof($f)) break; // если записей больше нет выходим из цикла
// Выводим данные
echo "<hr>Автор:<a href=mailto:$email>$name</a><br>";
echo "Сообщение:<br>$text<br>";
}
fclose($f);// закрываем файл
?>

А теперь то новое, что я обещал.

Тот, кто работает не в Денвере, а с сервером Apache, мог столкнуться с ситуацией, когда вроде бы правильно написанный скрипт отчего-то не жалает правильно работать, в частности, обрабатывать формы. Недавно один человек мне написал о такой проблеме - огромное ему спасибо, и вообще всем, кто обращается с вопросами: потому что я могу что-то попросту забыть и не уточнить в статьях или не заметить ошибки, ведь объёмы информации большие...

Короче, есть такая штука, как "глобальные переменные". В Apache их поддержка бывает отключена. Но это - мелочи, на своём компе вы можете менять настрйки, как душе взбредёт в голову. В частности, чтобы разрешить глобальные переменные, нужно настроить файл php.ini так, чтобы сервер PHP мог работать с глобальными переменными.

Найдите файл php.ini (в папке C:\PHP или C:\Windows), откройте его в Блокноте и найдите инструкцию register_globals = Off. Измените ее на On и сохраните файл. Кстати, о файлах... В Денвере, как я недавно узнал, эта инструкция тоже бывает отключена, так что, если что, ищите в Денвере php.ini и меняйте настройки точно так же.

Но вот если хостинг поставил запрет на глобальные переменные, тут уж ничего не попишешь... на первый взгляд.

К счастью, это дело тоже поправимо: есть возможность перевести глобальные переменные в обычные. вот это мы и совершим сейчас.

Добавляем страховку от хостингов, не поддерживающих глобальные переменные:

<?php
// страховка от хостингов, не поддерживающих глобальные переменные
if (isset ($_POST['name'])) //если существует глобальная переменная $_POST['name'], то
{
$name = $_POST['name']; //заменяем её на обычную переменную $name
}

if (isset ($_POST['email']))
{
$email = $_POST['email'];
}

if (isset ($_POST['text']))
{
$text = $_POST['text'];
}

if (isset ($_POST['summa']))
{
$summa = $_POST['summa'];
}

if (empty ($name) or empty ($email) or empty ($text)) //если перечисленные переменные отсутствуют
//выводим следующее сообщение
{
echo "Форма заполнена не полностью!";
exit (); //и останавливаем выполнение программы
}
if ($summa != 17)
{
echo "Сумма чисел с картинки указана не правильно!";
exit (); //и останавливаем выполнение программы
}
else
{
// ставим запрет на html-теги
$text = strip_tags ($text);
$email = strip_tags ($email);
$name = strip_tags ($name);
// заменяем все специальные символы их html-эквивалентом
$text = htmlspecialchars ($text);
$email = htmlspecialchars ($email);
$name = htmlspecialchars ($name);

$gbpath="gb.dat";// Путь к файлу с записями
if(!file_exists($gbpath))// проверяем есть ли файл $gbpath 
{
// если отсутствует, то создаем его
$f=fopen($gbpath,"w") or die ("Не могу создать файл"); // создание файла
flock($f,2) or die("Невозможно заблокировать файл"); // блокируем файл
fwrite ($f,"",0); // имитация записи в него
@chmod($f, 0664); // установка прав на запись
fclose($f); // Закрытие созданного файла
}
if(getenv("REQUEST_METHOD")=="POST"){// проверяем, если метод запроса POST
// то значит скрипт вызван формой записи сообщения
$f=fopen($gbpath,"r") or die("Не могу открыть файл"); // Открываем файл для чтения
$oldData = fread($f, filesize ($gbpath)); // считываем данные
fclose($f); // закрываем файл
$f=fopen($gbpath,"w+") or die("Не могу открыть файл"); // открываем файл для дописи
flock($f,2) or die("Невозможно заблокировать файл"); // блокируем файл
fputs($f,"$name\n"); // записываем имя автора
fputs($f,"$email\n"); // его e-mail
$text=ereg_replace("\n"," ",$text);// убираем возвраты каретки из сообщения
fputs($f,"$text\n"); // записываем сообщение
fwrite($f,$oldData); // записываем прежние данные
fclose($f); // закрываем файл
}
}
$f=fopen($gbpath,"r") or die("Не могу открыть файл");// открываем файл с записями
while(1){// вырожденный цикл, для чтения записей из файла
$name=fgets($f,1000);// считываем имя автора
$email=fgets($f,1000);// его e-mail
$text=fgets($f,1000);// сообщение
if(feof($f)) break; // если записей больше нет выходим из цикла
// Выводим данные
echo "<hr>Автор:<a href=mailto:$email>$name</a><br>";
echo "Сообщение:<br>$text<br>";
}
fclose($f);// закрываем файл
?>

Идём дальше.

Автор: Андрей Чернобай

P. S. Подпишитесь на безплатную рассылку Вокруг Сайта и получайте на свой электронный адрес новые уроки по созданию сайта.

Оставьте свой отзыв о статье:



Введите цифровой код с картинки*:

Новое на сайте

Другие статьи...

Видеокурсы

Рассылки

"Вокруг Сайта"
подпишитесь и получайте на свой e-mail уроки, книги, статьи, скрипты, а также подарки и скидки на товары, продаваемые с сайта

SmartResponder.ru
Ваше имя: *
Ваш e-mail: *

"PHP-песочница"
- PHP для начинающих: уроки с подробным анализом скриптов, необходимых для вашего сайта:

PHP-песочница
Подписаться письмом

Разделы Сайта