[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Система логина\аута
AlmazDelDiablo
Добрый вечер.
Сегодня, на середине пути понял, что не до конца понимаю логику системы логина. Вот, как я ее себе представлял изначально:
Если активен чекбокс «Запомнить меня» — пишется кука, например, с временем жизни 365 дней, а если нет, то без указания времени жизни. И, если вспомнить мою кжику по ПХП, то кука будет жить до закрытия браузера (кстати, я прав в этом?)

И вот еще. Посмотрите, на правильном ли я пути?
function generate_hash() { 
global $user;
$pass = str_shuffle( $user['password'] );
return $key = $pass . $user['id'] . date( 'H' );
}

function check_login( $name, $pass ) {
global $db;

$name = $db->safe( $name );
$pass = md5( md5($pass) );

$query = $db->query( "SELECT * FROM `". DB_PREF ."_webadmins` WHERE `name` = '$name'" );
$result = $db->get_assoc( $query );
if( $pass = $result['password'] ) {
return $result;
} else {
return FALSE;
}
}


if( isset($_POST['login']) || $_POST['login'] == 'вход' ) {
if( !$logged ) {
if( !empty($_POST['name']) || !empty($_GET['password']) ) {
$name = $_POST['name'];
$pass = $_POST['password'];

$user = check_login( $name, $pass );
if( $user != FALSE ) {
if( isset($_POST['remember']) ) {
$hash = generate_hash();
$db->query( "UPDATE `". DB_PREF ."_webadmins` SET `hash` = '$hash' WHERE `name` = '". $name ."'" );
setcookie( 'hash', $hash, time() + 60 * 24 * 365, 'www.'.$_SERVER['HTTP_HOST'] );
} else {
$hash = generate_hash();
setcookie( 'hash', $hash, FALSE, 'www.'.$_SERVER['HTTP_HOST'] );
}
$logged = TRUE;
msg( 'Вы успешно вошли в систему. <a href="'.$cfg['site_domain'].'index.php">Вернуться</a>', FALSE );
} else {
msg( 'Неправльно указан логин и/или пароль', TRUE );
}
}
else {
msg( 'Введите логин и пароль', TRUE );
}
}
else {
msg( 'Чтобы зайти под другим ником — сначала выйдите со своего аккаунта', FALSE );
}
}

При таком коде выдает ошибку:
Warning: Cannot modify header information - headers already sent by (output started at /login.php:24) in /login.php on line 24

24-я строка — это
setcookie( 'hash', $hash, FALSE, 'www.'.$_SERVER['HTTP_HOST'] );




Спустя 40 минут, 2 секунды (21.12.2010 - 16:57) ИНСИ написал(а):
Цитата
то кука будет жить до закрытия браузера (кстати, я прав в этом?)

неверно. Куки будет жить до того, времени, пока действует срок, который был указан при создании...

вот это:
Свернутый текст
function generate_hash() {
global $user;
$pass = str_shuffle( $user['password'] );
return $key = $pass . $user['id'] . date( 'H' );
}


можешь вот это использовать:
function generate_hash($len = 10) {
$a = range(0, 9); $b = range('a','z'); $c = range('A', 'Z');
$arr = array_merge($a, $b); $arr = array_merge($arr, $c); $arr = array_merge($arr, $arr);
$rand = microtime(true); $key = '';

for($i = 0; $i < $len; $i++) {
shuffle($arr);
$key .= $arr[(round(($rand * 1000 - floor($rand * 1000)),2) * 100 )];
$rand = microtime(true);
}
return $key;
}


$name = $db->safe( $name );

тут ты видать делаешь код безопасным?

также заметил, что ты используешь неверно знак ||. Пример:
!empty($_POST['name']) || !empty($_GET['password']


надо заменить на знак &&
!empty($_POST['name']) && !empty($_GET['password'].


это:
setcookie( 'hash', $hash, FALSE, 'www.'.$_SERVER['HTTP_HOST'] );

замени на:
setcookie( 'hash', $hash, '/' );


А где ты куки используешь? Ты ведь просто их создаешь... В целом, лучше измени свой код. Можно сделать все проще....


_____________
Блог | VK | GitHub | Twitch
Быстрый ответ:

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