Не могу понять почему не завершается сессия

pj

Новичок
Не могу понять почему не завершается сессия

Здравствуйте.

Есть скрипт:

PHP:
if($url == "login"){
	session_start();
			
	while (1 == 1){
		if (!isset($_SERVER['PHP_AUTH_USER'])) {
			header('WWW-Authenticate: Basic realm="test"');
			header('HTTP/1.0 401 Unauthorized');
			break;
		}
		else {
			//проверям валидность логин/пароль, если верны то заполняем $_SESSION['user'] и $_SESSION['rights'] и делаем break;
		}
		unset($_SERVER['PHP_AUTH_USER']);
	}
}		
elseif($url == "logout"){	
	session_destroy();
	header("Location: /products");
}

Не могу понять почему при $url = "logout" не завершается сессия. Т.е после логаута $_SESSION['user'] и $_SESSION['rights'] уничтожаются, но при следующем заходе ничего не спрашивается и переменные ($_SESSION['user'] и $_SESSION['rights']) восстанавливаются. Эксперементальным путём определил что сессия будет завершена только после закрытия броузера. Т.е если закрыть броузер, открыть и залезть на "login" скрипт спросит логин/пароль.

Да, чуть не забыл: session.use_cookies = 1 и session.use_trans_sid = 0.

Спасибо за помощь.
 

Фанат

oncle terrible
Команда форума
unset($_SERVER['PHP_AUTH_USER']);
очень, очень интересный код =)

можно посоветовать тебе не выпендриваться, а сделать запрос пароля через обычную html форму?
 

pj

Новичок
Фанат, вполне возможно, что в итоге так и сделаю. Тем не менее очень хочется понять где был не прав. Не могли бы вы объяснить, если не сложно?

Делаю
unset($_SERVER['PHP_AUTH_USER']);
чтобы при следующем витке цикла скрипт опять спросил логин/пароль.
 

pj

Новичок
Tranquil, только что попробовал. В итоге происходит абсолютно то-же самое, что и при session_destroy(). Т.е мои переменные в $_SESSION удаляются, но при этом при следующей попытке залогиниться он меня опять пускает сразу не спросив логин/пароль и соотв. восстанавливет переменные.
 

DiMA

php.spb.ru
Команда форума
Пароль браузера к сессиям отношения не имеет и команда
unset($_SERVER['PHP_AUTH_USER']); бессмысленна (ровно как и unset($_SERVER['HTTP_USER_AGENT']);

Надо записать в сессию флаг. В начало страницы условие - если есть флаг выдать 403, очистить флаг. Либо запоминать не флаг, а текущий логин, чтобы можно было перелогиниться.
 

Valdisss

Guest
pj
Если я не ошибаюсь PHP_AUTH_USER - это серверная переменная и ты её сам уничтожить не можешь.

Но это не точно.
 

Tranquil

Новичок
pj
Замени $_SERVER['PHP_AUTH_USER'] на $_SESSION["имя_переменной"]
и все будет
 

pj

Новичок
DiMA, вариант с флагом попробовал. Только мне 403 не подходит, в данном случае мне надо, чтобы окно для ввода логин/пароль выскакивало до тех пор, пока не будет введена правильная комбинация, либо пока не нажмут «Отмену». В итоге получилось следующее:

PHP:
f($url == "login"){
	session_start();

	if ($_SESSION['flag'] == 1){
		$_SESSION['flag'] = 0;
		unset($_SERVER['PHP_AUTH_USER']);
	}
			
	while (1 == 1){
		if (!isset($_SERVER['PHP_AUTH_USER'])) {
			header('WWW-Authenticate: Basic realm="test"');
			header('HTTP/1.0 401 Unauthorized');
			break;
		}
		else {
			//проверям валидность логин/пароль, если верны то заполняем $_SESSION['user'] и $_SESSION['rights'] и делаем break;
		}
		unset($_SERVER['PHP_AUTH_USER']);
	}
}		
elseif($url == "logout"){	
	unset($_SESSION['user']);
	unset($_SESSION['rights']);
	$_SESSION['flag'] = 1;
	header("Location: /products");
}
В итоге после логаута и попытки логина он действительно выводит запрос на логин/пароль до тех пора не будет введена правильная комбинация. Но, если нажать «Отмену» не вводя ничего на запрос логина/пароля и после этого обновить страницу мои $_SESSION['user'] и $_SESSION['rights'] вернутся обратно к своим значениям. Может быть я вас неправильно понял и написал кривой скрипт?

По поводу unset($_SERVER['PHP_AUTH_USER']). Если не писать эту строчку то апач благополучно виснет на моём бесконечном цикле при неверной комбинации логин/пароль.

Tranquil, где конкретно его поменять? Он у меня в нескольких местах есть.
 

Andreika

"PHP for nubies" reader
Если не писать эту строчку то апач благополучно виснет на моём бесконечном цикле при неверной комбинации логин/пароль.
а зачем делать бесконечный цикл если не хочется в нем висеть?


а де session_destroy восстанавливающий переменные?
 

Фанат

oncle terrible
Команда форума
стоило отойти на 5 минут, и тут же набежали профессора кислых щей.
Valdisss
вот ты спрашиваешь - почему я удаляю твои сообщения?
Да потому что у тебя недержание речи.
Знаешь, что неправильно - а всё равно лезешь.

-~{}~ 25.05.06 18:54:

pj
Tranquil, где конкретно его поменять? Он у меня в нескольких местах есть.
НИГДЕ.
Товарищ, как и Valdisss, не понимает, про что пишет.
И слушать его не надо.

-~{}~ 25.05.06 18:55:

Только мне 403 не подходит, в данном случае мне надо, чтобы окно для ввода логин/пароль выскакивало до тех пор, пока не будет введена правильная комбинация, либо пока не нажмут «Отмену».
это невозможно.
 

dr-sm

Новичок
я убиваю сессию так, вроде работает:
PHP:
$_SESSION = array();
if (isset($_COOKIE[$this->sessionName])) {
    	setcookie($this->sessionName, '', time() - 42000, '/');
}
// Finally, destroy the session.
session_destroy();
1. ты уверен, что нужен цикл while(1 == 1) ?
2. зачем стартовать сессию дотого как проверил логин/пароль?
 

Фанат

oncle terrible
Команда форума
Фанат, вполне возможно, что в итоге так и сделаю
не "вполне возможно", а у тебя просто нет других вариантов.

-~{}~ 25.05.06 18:58:

о господи.
третья обезьяна подтянулась.

ДЛЯ ВСЕХ НЕГРАМОТНЫХ ДЕТЕЙ, КОТОРЫЕ ПО НЕДОРАЗУМЕНЮ СЮДА ПОПАЛИ:

К СЕССИЯМ ПРОБЛЕМА ДАННОГО КЛИЕНТА ОТНОШЕНИЯ НЕ ИМЕЕТ!

всем хорошо видно?
Или ещё кто-то остался с проблемами зрения?
 

dr-sm

Новичок
Автор оригинала: Фанат
третья обезьяна подтянулась.
Спасибо ).
Только сейчас до меня дошел весь сакральный смысл конструкций приведенных топегстартером.
 

Фанат

oncle terrible
Команда форума
pj
Тем не менее очень хочется понять где был не прав. Не могли бы вы объяснить, если не сложно?
тебе надо внимательно прочитеть ответ DiMA

только ищи в нм не ответ - как сделать ту кривизну, которую ты хочешь, а читай там объяснение.
 

pj

Новичок
Фанат, благодарю, тему можно закрывать.

Спасибо всем ответившим.
 

DiMA

php.spb.ru
Команда форума
if (!isset($_SESSION['realm'])) $_SESSION['realm']=md5(microtime());
header('WWW-Authenticate: Basic realm=\"test-$_SESSION[realm]\"');

***

if (...) {
$_SESSION['flag']=1
$_SESSION['realm']=md5(microtime());
}


это решит проблему с ОТМЕНОЙ
 
Сверху