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

  • Автор темы Автор темы pj
  • Дата начала Дата начала

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.

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

Делаю
unset($_SERVER['PHP_AUTH_USER']);
чтобы при следующем витке цикла скрипт опять спросил логин/пароль.
 
Tranquil, только что попробовал. В итоге происходит абсолютно то-же самое, что и при session_destroy(). Т.е мои переменные в $_SESSION удаляются, но при этом при следующей попытке залогиниться он меня опять пускает сразу не спросив логин/пароль и соотв. восстанавливет переменные.
 
Пароль браузера к сессиям отношения не имеет и команда
unset($_SERVER['PHP_AUTH_USER']); бессмысленна (ровно как и unset($_SERVER['HTTP_USER_AGENT']);

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

Но это не точно.
 
pj
Замени $_SERVER['PHP_AUTH_USER'] на $_SESSION["имя_переменной"]
и все будет
 
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, где конкретно его поменять? Он у меня в нескольких местах есть.
 
Если не писать эту строчку то апач благополучно виснет на моём бесконечном цикле при неверной комбинации логин/пароль.
а зачем делать бесконечный цикл если не хочется в нем висеть?


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

-~{}~ 25.05.06 18:54:

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

-~{}~ 25.05.06 18:55:

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

-~{}~ 25.05.06 18:58:

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

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

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

всем хорошо видно?
Или ещё кто-то остался с проблемами зрения?
 
Автор оригинала: Фанат
третья обезьяна подтянулась.
Спасибо ).
Только сейчас до меня дошел весь сакральный смысл конструкций приведенных топегстартером.
 
pj
Тем не менее очень хочется понять где был не прав. Не могли бы вы объяснить, если не сложно?
тебе надо внимательно прочитеть ответ DiMA

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

Спасибо всем ответившим.
 
if (!isset($_SESSION['realm'])) $_SESSION['realm']=md5(microtime());
header('WWW-Authenticate: Basic realm=\"test-$_SESSION[realm]\"');

***

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


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