|
|
|
|
<?php
// Это файл handler.php
// Имя сервера базы данных, например $dblocation = "mysql28.noweb.ru"
// сейчас выставлен сервер локальной машины
$dblocation = "localhost";
// Имя базы данных
$dbname = "gbook";
// Имя пользователя... Скорее всего будет совпадать с вашим доменным именем
// у нас, например $dbuser = "softtime";
$dbuser = "root";
// Пароль - в комментариях не нуждается ;-)
$dbpasswd = "";
// Соединяемся с сервером базы данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) {
echo( "<P>В настоящий момент сервер базы данных не
доступен, поэтому корректное отображение
страницы невозможно.</P>" );
exit();
}
// Выбираем базу данных
if (! @mysql_select_db($dbname,$dbcnx) ) {
echo( "<P>В настоящий момент база данных не доступна,
поэтому корректное отображение страницы
невозможно.</P>" );
exit();
}
// Формируем и выполняем SQL-запрос для посетителя с
// именем $_POST['name']
$query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
$nme = mysql_query($query);
if(!$nme)
{
echo mysql_error();
echo "Ошибка выполнения запроса";
exit();
}
// Если запрос вернул результат - производим дальнейшую обработку
if(mysql_num_rows($nme) > 0)
{
// Получаем пароль
$password = mysql_result($nme, 0);
// Сравниваем пароль из базы данных и введённый посетителем
if ($_POST['password'] == $password)
{
// Идентификация прошла успешно - осуществляем
// "вход" посетителя. Для того, чтобы в течении текущей
// сесси посетитель не вводил своё имя пароль повторно -
// передаём их через сессию
if(session_start())
{
$_SESSION['user'] = $_POST['name'];
$_SESSION['password'] = $_POST['password'];
// Осуществляем автоматический переход на
// страницу index.php чтобы убедится, что
// посетитель "вошёл"
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD><body>";
}
}
else
{
echo "Ошибка идентификации: неправильный пароль";
exit();
}
}
// Если в результате запроса не получено ни одной
// строки - посетитель с таким именем не зарегистрирован
else
{
echo "Ошибка идентификации: посетитель не зарегистрирован";
exit();
}
?>
|
Форма
<?php
session_start();
?>
<form action=handler.php method=post>
Имя посетителя : <input type=text name=name value=<?php echo $_SESSION['user']; ?>><br>
Пароль : <input type=password name=password value=<?php echo $_SESSION['password']; ?>><br>
<input type=submit value=Отправить>
</form>
<?php
// Если посетитель "вошёл" - приветствуем его
if(isset($_SESSION['user'])) echo "Здравствуйте, ".$_SESSION['user']."!";
?>
|
Вопрос......В коде все понятно. Не понятен механизм работы самой авторизации. Как я узнаю что пользователь зашел и зарегестрирован..через ссесию.? Тогда вопрос такой...мне всегда придется проверять существует ли эта сессия...или как (чтобы знать пользователь зарегестрировался или нет)? К примеру у меня есть страница администрирования. Как мне сделать так чтобы пользователь не мог зайти туда без знания пароля и имени. Хотя простым введением ../administration.php он туда попадет. Если не трудно приведите примерчик...как сделать чтобы я понял как этот механизм работает..или обьясниет по подробнее или ссылочки дайте кому не трудно..спасибо | |
|
|
|
|
|
|
|
для: hatsker
(04.12.2005 в 04:57)
| | Ну во первых в коде аторизации желательно сделать следующее:
$name=htmlspecialchars(stripslashes(trim(mysql_escape_string($login))));
$password=htmlspecialchars(stripslashes(trim(mysql_escape_string($password))));
|
Иначе вам не избежать SQL иньекции.
Насчёт пролзователя и сессии - да. Это самый простой способ. Можно записат ьмеханизм в отдельный файл и затем инклудом впихнуть его во все соатльные файлы.
Что бы защитить страницу администратирования одной сессии с запоминанием логина и пароля мало, иначе взломать будет довольно легко. Для этого нужна ещё уникальная сессия. Её можно получить, например, вот так:
$session_id=md5(time());
$_SESSION['session_id'] = $session_id;
|
Далее тебе потребуется отдельная БД, в которой будет храниться имя сессии и последнее посещение. Вот например вот такая:
CREATE TABLE session (
id_session int(5) NOT NULL AUTO_INCREMENT,
session_id text,
last_time text,
PRIMARY KEY (id_session)
) TYPE=MyISAM;
|
Далее, после создания сесии, мы удаляем из таблицы старые записи и вставляем новые:
$time=time();
$past=time()-300;
$delete_session=mysql_query("DELETE FROM session WHERE last_time < '$past'");
if (!$delete_session) {
echo mysql_error();
die();
}
$vstavka_session=mysql_query("INSERT INTO wwt_session VALUES (0,'$session_id','$time')");
if (!$vstavka_session) {
echo mysql_error();
die();
}
|
Теперь в каждую старницу, которую необходимо зашщитить вставляем код:
session_start();
$code=$_SESSION['session_id'];
if (!$_SESSION['session_id']) {
echo "Вам сюда нельзя!!!";
die();
} else {
$ath_ses=mysql_query("SELECT * From session WHERE session_id='$code' '");
if (!$ath_ses) {
echo mysql_error();
die ();
}
$kol=mysql_num_rows($ath_ses);
if ($kol<=0) {
echo "Такой сессии не существует. Вы не можите здесь быть!!!";
die();
} else {
$time=time();
$smena_query="UPDATE session SET last_time='$time' WHERE session_id='$code'";
$smena=mysql_query($smena_query);
if (!$smena) {
echo mysql_error();
die ();
}
$past=time()-300;
$delete_session=mysql_query("DELETE FROM session WHERE last_time < '$past'");
if (!$delete_session) {
echo mysql_error();
die();
}
}
}
|
Ну вот вроде и все! | |
|
|
|
|
|
|
|
для: Football
(04.12.2005 в 09:30)
| | Понял...Вы ответили на мой вопрос. Спасибо.....К стати код взят с сайта softtime.ru (в моём верхнем посте)....То есть мне нужно вставлять этот код на каждую страницу которую мне нужно защитить..Ок я понял. И если ссесии нет при проверке...то он просто не покажет страницу die(); Я правильно понял ? А за код спасибо...Если бы вы еще и свои исправления вставили в тот код который я запостил, было бы просто супер. Хотя и на этом спасибо. Thanx. | |
|
|
|
|
|
|
|
для: Football
(04.12.2005 в 09:30)
| |
$ath_ses=mysql_query("SELECT * From session WHERE session_id='$code' '");
|
в этой строке ошибка - лишняя кавычка.
надо так:
$ath_ses=mysql_query("SELECT * From session WHERE session_id='$code'");
|
и здесь нужно название таблицы просто session, wwt_ не нужно, это из другой жизни (скрипта)
| |
|
|
|
|
|
|
|
для: elenaki
(05.12.2005 в 18:52)
| | Ага, спасибо что подправили. Это из своего кода брал, пришлось немного переделывать поскольку у меня и название таблицы другое и защита с ещё несколькими "фокусами" :) | |
|
|
|
|
|
|
|
для: Football
(05.12.2005 в 20:44)
| | а еще - вот здесь:
$name=htmlspecialchars(stripslashes(trim(mysql_escape_string($login))));
$password=htmlspecialchars(stripslashes(trim(mysql_escape_string($password))));
|
почему stripslashes? ведь перед вводом в базу надо делать addslashes, т.е. экранировать "плохие" символы. а stripslashes - перед выводом из базы.
это ошибка, опечатка или новая мода? | |
|
|
|
|
|
|
|
для: elenaki
(11.12.2005 в 12:31)
| | Однако права elenaki. Надо бы addslashes. Очепятка, наверное :-) | |
|
|
|