index.php
<?php
include 'db.php';
include 'auth.php';
$main=<<<HTML
<html>
<head>
<title>Тест авторизации</title>
</head>
<body>
<table>
<tr>
<td><h1>Добро пожаловать на сайт</h1><br /></td>
</tr>
<tr>
<td>$info</td>
</tr>
</table>
</body>
</html>
HTML;
echo $main;
?>
auth.php
<?php
session_start();
$time = 86400; // время жизни куки при нажатии кнопки "запомнить"
//если кнопка выхода не нажата
if (!isset($_GET['logout'])) {
//если есть куки
if (isset($_COOKIE['login']) && isset($_COOKIE['password'])){
//есть куки и нет сессии
if (!isset($_SESSION['user_id'])){
$login = mysql_escape_string($_COOKIE['login']);
$password = mysql_escape_string($_COOKIE['password']);
$query = "SELECT `id`
FROM `users`
WHERE `login`='{$login}' AND `password`='{$password}'
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
//есть ли в бд
if (mysql_num_rows($sql) == 1){
//авторизован!
//создаем сессию,продлеваем куки,инклюдим инфу
$row = mysql_fetch_assoc($sql);
$_SESSION['user_id'] = $row['id'];
include 'userinfo.php';
setcookie('login', $login, time()+$time, "/");
setcookie('password', $password, time()+$time, "/");
}else{
setcookie('login', '', 0, "/");
setcookie('password', '', 0, "/");
}
}else{
$query = "SELECT `login`
FROM `users`
WHERE `id`='{$_SESSION['user_id']}'
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
//есть ли в бд
if (mysql_num_rows($sql) != 1){
//НЕ авторизован!
//инклюдим авторизацию
include 'login.php';
}
//авторизован!
//продлеваем куки,инклюдим инфу
include 'userinfo.php';
setcookie('login', $login, time()+$time, "/");
setcookie('password', $password, time()+$time, "/");
}
}else{
//если нет куки и нет сессии
if (!isset($_SESSION['user_id'])){
//НЕ авторизован!
//инклюдим авторизацию
include 'login.php';
}else{
$query = "SELECT `login`
FROM `users`
WHERE `id`='{$_SESSION['user_id']}'
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
//есть ли в бд
if (mysql_num_rows($sql) != 1){
//НЕ авторизован!
//инклюдим авторизацию
include 'login.php';
}
//авторизован!
//инклюдим инфу
include 'userinfo.php';
}
}
}else{
//кнопка выход нажата
if (isset($_SESSION['user_id'])){
unset($_SESSION['user_id']);
}
setcookie('login', '', 0, "/");
setcookie('password', '', 0, "/");
}
header('Location: index.php');
?>
userinfo.php
<?php
$query = "SELECT `id`, `login`, `password`
FROM `users`
WHERE `id`='{$_SESSION['user_id']}'
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);
$info=<<<HTML
Ваш id: {$row['id']} <br />
Логин: {$row['login']} <br />
Пароль (md5): {$row['password']} <br />
<a href="?logout">Выход</a>
HTML;
?>
login.php
<?php
$info=<<<HTML
<form action="" method="post">
<table>
<tr>
<td>Логин:</td>
<td><input type="text" name="login" /></td>
</tr>
<tr>
<td>Пароль:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>Запомнить:</td>
<td><input type="checkbox" name="remember" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="enter" value="Войти" /></td>
</tr>
</table>
</form>
HTML;
if(isset($_POST['login'])){
$login = (isset($_POST['login'])) ? mysql_real_escape_string($_POST['login']) : '';
$password = md5($_POST['password']);
$query = "SELECT `id`
FROM `users`
WHERE `login`='{$login}' AND `password`='{$password}'
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
// если пароль и логин не совпадают с БД
if (mysql_num_rows($sql) !== 1){
header('Location: index.php');
exit;
}else{
$login = (isset($_POST['login'])) ? mysql_real_escape_string($_POST['login']) : '';
$password = md5($_POST['password']);
$row = mysql_fetch_assoc($sql);
$_SESSION['user_id'] = $row['id'];
//если выбрано "запомнить"
if (isset($_POST['remember'])){
setcookie('login', '$login', time()+$time, "/");
setcookie('password', '$password', time()+$time, "/");
}
header('Location: index.php');
}
}
?>
Так то работает,но проблема в том что при авторизации не устанавливаются куки. Вот тут вот что-то не идет:
//если выбрано "запомнить"
if (isset($_POST['remember'])){
setcookie('login', '$login', time()+$time, "/");
setcookie('password', '$password', time()+$time, "/");
}
Спустя 4 минуты, 26 секунд (22.10.2011 - 20:55) Игорь_Vasinsky написал(а):
загадки загадываем?
Спустя 8 минут, 41 секунда (22.10.2011 - 21:03) dadli написал(а):
может бить $time ничего не ровно
напиши так, что виведет?
напиши так, что виведет?
if (isset($_POST['remember'])){
setcookie('login', '$login', time()+$time, "/");
setcookie('password', '$password', time()+$time, "/");
//
echo $time;
//
}
Спустя 3 минуты, 32 секунды (22.10.2011 - 21:07) lightstar написал(а):
нет, $time выводится
Спустя 46 минут, 1 секунда (22.10.2011 - 21:53) imbalance_hero написал(а):
lightstar
А ты вместо $time напиши своё число, +3600, допустим, и проверяй.
И как ты выводишь куки, напиши:
А ты вместо $time напиши своё число, +3600, допустим, и проверяй.
И как ты выводишь куки, напиши:
echo '<pre>'.print_r($_COOKIE,1).'</pre>';
Спустя 2 минуты, 33 секунды (22.10.2011 - 21:55) lightstar написал(а):
Цитата |
А ты вместо $time напиши своё число, +3600, допустим, и проверяй. |
Не помогает
Спустя 10 минут, 55 секунд (22.10.2011 - 22:06) Игорь_Vasinsky написал(а):
error_reporting(E_ALL);
вначале скрипта
Спустя 8 минут, 28 секунд (22.10.2011 - 22:15) lightstar написал(а):
Нашел ошибку вот тут в auth.php:
Было
Исправил
Куки обнулялись тк $login и $password были пусты.
Еще вопрос: насколько безопасен этот метод авторизации + если добавить соль с двух сторон password?
И еще вопрос: как обезопасить сессию. может по первым/последним N символам md5 логина,а не по id?
Было
$query = "SELECT `login`
FROM `users`
WHERE `id`='{$_SESSION['user_id']}'
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
//есть ли в бд
if (mysql_num_rows($sql) != 1){
//НЕ авторизован!
//инклюдим авторизацию
include 'login.php';
}
//авторизован!
//продлеваем куки,инклюдим инфу
include 'userinfo.php';
setcookie('login', $login, time()+$time, "/");
setcookie('password', $password, time()+$time, "/");
Исправил
$query = "SELECT `login`, `password`
FROM `users`
WHERE `id`='{$_SESSION['user_id']}'
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
//есть ли в бд
if (mysql_num_rows($sql) != 1){
//НЕ авторизован!
//инклюдим авторизацию
include 'login.php';
}
$row = mysql_fetch_assoc($sql);
//авторизован!
//продлеваем куки,инклюдим инфу
include 'userinfo.php';
setcookie('login', $row['login'], time()+$time, "/");
setcookie('password', $row['password'], time()+$time, "/");
Куки обнулялись тк $login и $password были пусты.
Еще вопрос: насколько безопасен этот метод авторизации + если добавить соль с двух сторон password?
И еще вопрос: как обезопасить сессию. может по первым/последним N символам md5 логина,а не по id?
Спустя 3 минуты, 11 секунд (22.10.2011 - 22:18) Игорь_Vasinsky написал(а):
нормален. с одной хватит, sha1 или md5
передавай session_id() в hidden input - в обработчике сверяй.
этот момент запомни для себя
как заливать будешь на хост
передавай session_id() в hidden input - в обработчике сверяй.
этот момент запомни для себя
error_reporting(E_ALL);
как заливать будешь на хост
error_reporting(0);
Спустя 7 минут, 22 секунды (22.10.2011 - 22:25) lightstar написал(а):
Цитата |
передавай session_id() в hidden input - в обработчике сверяй. |
Сверять в таком стиле?
<input type="hidden" name="try" value="{session_id()}" />
...
if($_POST['try'] !== session_id()){
exit;
}
и на всех страница, или только при авторизации?
Спустя 1 минута, 58 секунд (22.10.2011 - 22:27) Игорь_Vasinsky написал(а):
из формы прилетело знаячение session_id
в обработчике
только после авторизации
в обработчике
$session_id = session_id();
if($session_id == $_POST['try'])
//Всё пучком.. чел сл страницы авторизации пришёл.
только после авторизации
Спустя 3 минуты, 36 секунд (22.10.2011 - 22:31) lightstar написал(а):
Цитата |
Игорь_Vasinsky |
ясно, спасибо