[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не устанавливаются куки
lightstar
Нашел скрипт авторизации. Решил переделать тк при нажати "запомнить меня" куки запоминались на N времени и не обновлялись. Вот что у меня получилось:

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, допустим, и проверяй.

И как ты выводишь куки, напиши:
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:
Было
$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 - в обработчике сверяй.

этот момент запомни для себя

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

ясно, спасибо
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.