Отправляет email-рассылки с помощью сервиса Sendsay

PHP-песочница

  Все выпуски  

PHP-песочница Выпуск 14


Php-«песочница»

Выпуск 14. Безопасность web-приложений.

Здравствуйте, с вами Андрей Чернобай с новым выпуском рассылки «Php-песочница».

За прошлые выпуски мы создали не так уж много скриптов. Скрипт регистрации на сайте, скрипт проверки имени пользователя и пароля, счётчик посещений. Всего три. Возможно, кто-то хочет побыстрее увеличить это число, хочет, чтобы скриптов в рассылке было как можно больше и разных… Однако даже на примере одного, двух скриптов можно  узнать очень много. Потому что каждый скрипт можно улучшать, совершенствовать чуть ли не до безконечности, добавляя в него новые и новые элементы.

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

В этом уроке я хочу уделить некоторое внимание мерам безопасности сайта. Дело в том, что любой сайт можно взломать: украсть конфиденциальную или платную информацию, испортить/уничтожить страницы, файлы или базу данных. И если страницу сайта восстановить легко, то потерять базу данных совсем не хорошо. Потому что не все хостеры создают копии, а если и создают, то не каждый день.

Почему взламывают сайты я говорить не буду, это вопрос не к web-мастеру, а, чаще всего, к психиатру. Это в случаях, когда взломом занимаются из желания доказать что-то вроде превосходства, а других способов голова не находит… Кто-то взламывает по заказу. Это профессиональные взломщики, каковых намного меньше, чем «васьков», мечтающих таким образом запечатлеть своё редкое имя в веках. Защиту от профессионального взлома мы рассматривать не будем, поскольку это требует не только правильного написания кода, но и защиты самого сервера, на котором размещён сайт. А это возможно только при тесном сотрудничестве с хостером.

Мы поговорим о защите от всемирно неизвестного, но очень популярного ныне Васи Пупкина, возомнившего себя великим крекером.

Но прежде чем приступить к защите сайта, хочу ещё внести ясность в вопрос о «крекерах» и «хакерах».

Хакером принято называть человека, занимающегося взломом программ и сайтов. На самом деле такое представление сложилось благодаря СМИ и кино, к реальному положению вещей отношения не имеет. По определению, хакер – «это программист высочайшей квалификации, способный создавать программы без предварительной разработки детальной спецификации, а также вносить изменения в работающие программы, в том числе и на уровне машинного кода». Как видите, о взломе ни слова. Наоборот, хакер в компьютерном мире выполняет созидательную функцию. А взломом занимаются крекеры (от cracker).

Два самых распространённых метода взлома.

Наиболее часто применяются два метода: межсайтовый скриптинг и SQL-инъекции.

Межсайтовый скриптинг

При этом методе злоумышленник внедряет свой php- или html-код в сценарий страницы сайта, отчего страница, как минимум, может отображаться не правильно. А как максимум… Поговорим о том, как уберечься от внедрения зловредного кода в страницы сайта.

Как правило, от такого метода страдают плохо защищённые гостевые книги или форумы, позволяющие использовать html-теги. Впрочем, вредоносных код можно запустить через любую форму, обрабатываемую php-скриптом.

Как же уберечься от таких атак?

В php есть две функции, которые могут помочь нашей задаче:

- strip_tags (первый параметр, ‘второй параметр’) – удаляет из строки все html-теги;

- HtmlSpecialChars (параметр) – заменяет все специальные символы на их html-эквиваленты.

В функции strip_tags первый параметр – это имя переменной, передаваемой из формы; второй параметр – разрешённые теги, которые просто перечисляются друг за другом, например, так: strip_tags ($name, ‘<b><p><strong>’).

Впрочем, настоятельно рекомендую запрещать все теги, хоть и самые безобидные.

SQL-инъекции

Этот метод ещё хуже, его применение может привести к краже информации и к полному уничтожению базы данных. Но о защите от этого метода я говорить здесь не буду, так как мы создаём скрипты без использованию баз данных и показать на каком-то конкретном примере я просто не смогу. Если вы хотите научиться создавать профессиональные  сайты на PHP с использованием баз данных MySQL, лучше обратитесь к курсу «PHP + MySQL для начинающих», там вся эта информации представлена очень подробно и наглядно.

Я же думаю, что пора переходить к практике, применив рассмотренную выше теорию.

Применим функции strip_tags () и HtmlSpecialChars () к скрипту регистрации на сайте.

Напомню: сам скрипт находится в файле reg.php и сейчас выглядит так (см. в первых выпусках рассылки или на сайте http://vokrug-saita/kurs_php.php ):

 <?php
if (($name == "") || ($password == "") || ($email == ""))
{
echo "<p>Форма заполнена не полностью! Вернитесь, пожалуйста, и заполните все поля формы!</p>";
exit ();
}
else
{

/*удаляем лишние пробелы из формы*/
$name = trim ($name);
$password = trim ($password);
$email = trim ($email);
$newfile = fopen($name, "w");
fwrite ($newfile, $password);
fwrite ($newfile, "\n");
fwrite ($newfile, $email);
fwrite ($newfile, "\n");
fclose ($newfile);
echo "<p>Поздравляем Вас, " .$name. ". Регистрация прошла успешно.</p>";
}
// далее реализуем отправку нового комментария на адрес админа сайта
$address = "admin@localhost.ru";
$subject = "Новый зарегистрированный пользователь на сайте";
$message = "На сайте зарегистрирован новый пользователь: " .$name. ". Его пароль: " .$password. ". Его e-mail: " .$email;
//далее прописываем функцию для отправки сообщения
mail ($address, $subject, $message, "Content-type:text/plain; Charset=windows-1251\r\n");
 
/*чтение из файла с помощью функции fread */
$file = fopen($name, "r");
$n = fread ($file, 100);
echo "<p>Ваш пароль: " .$n. ". Сохраните его.</p>";
fclose ($file);
 
/*чтение из  файла с помощью функции file и массива*/
$rfile = fopen($name, "r"); /*открываем файл только для чтения*/
$data = file($name); /* считываем открытый файл в массив $data*/
echo "Ваш пароль: " .$data[0]. ". Ваш электронный адрес: " .$data[1]. ". Сохраните свои данные."; //выводим из массива на страницу
fclose ($rfile); //закрыли файл
?>

В самой форме регистрации три поля: для ввода пароля, имени и электронного адреса. Эти-то поля и нужно защитить от вредного кода, запретив передачу html- и php-кода с переменными $name, $password и $email .

Сделать это очень просто: добавим следующий код (новый код, как всегда, зелёным):

 <?php
if (($name == "") || ($password == "") || ($email == ""))
{
echo "<p>Форма заполнена не полностью! Вернитесь, пожалуйста, и заполните все поля формы!</p>";
exit ();
}
else
{

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

 
/*удаляем лишние пробелы из формы*/
$name = trim ($name);
$password = trim ($password);
$email = trim ($email);
$newfile = fopen($name, "w");
fwrite ($newfile, $password);
fwrite ($newfile, "\n");
fwrite ($newfile, $email);
fwrite ($newfile, "\n");
fclose ($newfile);
echo "<p>Поздравляем Вас, " .$name. ". Регистрация прошла успешно.</p>";
}

// далее реализуем отправку нового комментария на адрес админа сайта
$address = "admin@localhost.ru";
$subject = "Новый зарегистрированный пользователь на сайте";
$message = "На сайте зарегистрирован новый пользователь: " .$name. ". Его пароль: " .$password. ". Его e-mail: " .$email;

//далее прописываем функцию для отправки сообщения
mail ($address, $subject, $message, "Content-type:text/plain; Charset=windows-1251\r\n");
 
/*чтение из файла с помощью функции fread */
$file = fopen($name, "r");
$n = fread ($file, 100);
echo "<p>Ваш пароль: " .$n. ". Сохраните его.</p>";
fclose ($file);
 
/*чтение из  файла с помощью функции file и массива*/
$rfile = fopen($name, "r"); /*открываем файл только для чтения*/
$data = file($name); /* считываем открытый файл в массив $data*/
echo "Ваш пароль: " .$data[0]. ". Ваш электронный адрес: " .$data[1]. ". Сохраните свои данные."; //выводим из массива на страницу
fclose ($rfile); //закрыли файл
?>

Вот и всё, как всегда, ничего сложного. Самостоятельно проверьте работу скрипта, вводя в поля формы теги.

Успехов. И до встречи в ближайшем выпуске.

Андрей Чернобай
kapitansg@yandex.ru

P. S. Прошлые уроки по PHP живут по этому адресу >>>>>.


В избранное