Здравствуйте, с вами Андрей Чернобай с новым выпуском рассылки «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); //закрыли файл
?>
Вот и всё, как всегда, ничего сложного. Самостоятельно проверьте работу скрипта, вводя в поля формы теги.