Предохраняйся с помощью сессий

На первой странице (index.php) делаем форму для ввода данных:

<form method=post аction="index2.php">
<table align="center" cellspacing="2" cellpadding="2" border="0" width="320">
<tr>
<td width="100">Имя:</td>
<td width="200"><input type="text" name="name"<</td>
</tr>
<tr>
<td width="100">Пароль:</td>
<td width="200"><input type="password" name="pass"></td>
</tr>
<tr>
<td colspan="2" width="300">
<center>
<input type="submit" value="Вход"> <input type="reset" value="Сбросить">
</center>
</td>
</tr>
</table>
</form>


Думаю здесь пояснять ничего не нужно. Идем дальше: Сначала краткое пояснение. Мы создаем функцию проверки пользователя check(). У нас есть база данных my_site, содержащая поля id, name и pass, где name и pass - логин и пароль пользователя соответственно. Функция пропускает только тех, кто указал верный логин и пароль в форме ($name, $pass) на входе, потом эти переменные сохраняются в сессию, следовательно, пока сессия жива пользователь может заходить на ваш сайт без авторизации. Даже указав другой верный логин и пароль, он будет авторизирован под указанным ранее логином.

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

<?
function check()
{
if (empty($pass)||empty($name))
error("Не указан логин или пароль");
$sql="select * from my_site where login='".$name."'";
if ($show=mysql_query($sql))
{
$a=mysql_fetch_array($show);
if ($a['pass']!=$pass)
error("Не верное сочетание логин - пароль");
else
session_register("name","pass");
}
else
error("Ошибка запроса к базе данных");
}
?>


Начнем пояснения с первой строки. if (empty($pass)||empty($name))
Проверяем задан ли пароль и логин. Если одно из полей пустое, то
error("Не указан логин или пароль"); Здесь error - это любая функция вывода ошибки.
В следующей статье я подробно затрону эту тему (вывод ошибки, запись ее в лог, отправка отчета об ошибке и т.д.), а пока мы можем обойтись простой функцией:

<?
function error($er)
{
echo $er;
exit(0);
}
?>


Если поля не пусты, то скрипт продолжает работу.
$sql="select pass from mysite where login='".$name."'";
Пишем запрос к базе mysql, который вернет нам значение поля pass, строки, где login=$name.
if ($show=mysql_query($sql))
Если запрос обработан без ошибок, то
$a=mysql_fetch_array($show);
Присваиваем переменной $а (ассоциативный массив) значение поля pass
if ($a['pass']!=$pass)
error("Не верное сочетание логин - пароль");
Если поле pass не соответствует тому, что ввел пользователь или тому, что хранится в сессии, то мы опять через функцию error выводим ему ошибку.
else
session_register("name","pass");
Иначе записываем переменные $name и $pass в сессию и продолжаем выполнять скрипт.
}
else
error("Ошибка запроса к базе данных");
}
?>
Если есть ошибка в запросе к базе mysql, то мы опять же выводим ошибку пользователю.


Итак, вначале каждой страницы, к которой нужно запретить доступ посторонним пишем:

<?
session_start();
// эта функция открывающая или продолжающая работу с сессиями. Она должна 
//быть задана в самом начале страницы до отправки заголовка страницы.
check();
//наша функция проверки.
?>


Теперь проверим логику скрипта. Если человек не заполняет одно из полей и нажимает кнопку "вход", то перейдя на страницу index2.php он получит надпись "Ошибка: Не указан логин или пароль".

Если он указывает неверный логин или пароль, то ему выпадает "Ошибка: Не верное сочетание логин - пароль".

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

Возможные проблемы:

Нельзя заходить на сайт под разными именами.
Если человек раз зашел на сайт, то с его компьютера можно посещать этот сайт еще в течении некоторого времени (пока жива сессия), что не очень хорошо, если ты работаешь из Интернет салона.
Решение этих проблем будет описано в следующих статьях. Также будут затронуты вопросы: система обнаружения атак и попыток подбора пароля, с отправкой отчета по почте, функция вывода ошибок, с записью в лог файл.




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка