.htpasswd logout

Oscar

Новичок
.htpasswd logout

Знаю, что на эту тему уже говорили и далеко не раз и что везде пишут: используйте куки или сессии,
но вот я тут один вариант придумал и хотел узнать мнения о его надёжности.

Совершенно случайно наткнулся на следующее поведение Apache:
Если в .htaccess задан файл ErrorDocument 401 test.php, то обращение к test.php происходит после вызова окна авторизации, но до дого, как пользователь введёт данные.

И что с того?

При поиску по форуму нашел в теме Нетривиальный контроль доступа увидел фразу "ПЕРЕПИСЫВАЕМ .htaccess" и подумал: а почему бы не переписать .htpasswd ?

Суть метода:

0. .htaccess (с HTTP авторизацией .htpasswd и ErrorDocument 401 login.php)

1. logout.php : удаляет из .htpasswd строку с текущим пользователем и записывает её в файл .lock

2. login.php : добавляет в .htpasswd строку из .lock и удаляет .lock

И вот тут самое оно: Поскольку login.php вызовется ДО проверки авторизации, то все пользователи будут вовремя находится в файле .htpasswd

------
Вопрос: насколько это надёжно?
------

В общем вот код:

.htacess
Код:
DirectoryIndex index.php
<Files index.php>
AuthUserFile /path_to_this_directory/.htpasswd
AuthName "test"
AuthType Basic
require valid-user
</Files>
ErrorDocument 401 /url_path/login.php
index.php
PHP:
Welcome, <?=$_SERVER["PHP_AUTH_USER"]?>!<br />
<br />
<a href="logout.php">logout</a>
logout.php
PHP:
<?php
if (isset($_SERVER["PHP_AUTH_USER"]) && !file_exists(".lock")) {

	$savedLine = "";
	$newLines = array();
	$oldLines = file(".htpasswd");

	for($i = 0; $i < count($oldLines); $i++) {
		if (strpos($oldLines[$i], $_SERVER["PHP_AUTH_USER"].":") === false) {
			$newLines[count($newLines)] = $oldLines[$i];
		} else {
			$savedLine = $oldLines[$i];
		}
	}

	$handle = fopen(".htpasswd", "w");
	fwrite($handle, implode("", $newLines));
	fclose($handle);


	$handle = fopen(".lock", "w");
	fwrite($handle, $savedLine);
	fclose($handle);
}
?>
<a href="./">relogin</a>
login.php
PHP:
<?php
if (file_exists(".lock")) {
	$handle = fopen(".htpasswd", "a");
	fwrite($handle, implode("", file(".lock")));
	fclose($handle);

	unlink(".lock");
}
?>
<a href="./">login</a>
 

WP

^_^
Помоему проще сейчатку глаза сканнировать и получать её по факсу. А если серьезно.... зачем? Это же неимоверный изврат. Существуют ведь сессии, которые служат не только для хранения идентификационных данных. Так что советую не изобретать одноколесный велосипед который постоянно падает.
> Вопрос: насколько это надёжно?
Идея понятна, настолько же надеждо как и традиционная сессионная. Но это изврат.
 

alpes

Весь мир на ладони
Как по мне то метод HTTP авторизации сам по себе содержит логаут. Закрой открытые браузеры (в IE ток дочерние) - вот тебе и будет логаут.
 

Oscar

Новичок
WP,

настолько же надеждо как и традиционная сессионная
я бы не утверждал, что она так уж и надёжна.
Opera (8.5 у меня), по "relogin" заходит автоматически, на кэшированую страницу .. хотя .. как она себя с сессией ведёт - не смотрел.


alpes
метод HTTP авторизации сам по себе содержит логаут
Можно поинтересоваться, как бы ты сделал, чтобы нажав на кноку "logout", можно было зайти под другим пользователем?
 

WP

^_^
Oscar
Стопудняк просто отправил заголовоки типа WWW-Authenticate: Basic realm="Secret Zone"
HTTP/1.0 401 Unauthorized
 

alpes

Весь мир на ладони
а что тебе мешает вместо манипуляций с файлами писать в сессию по ссылке "выход": logout=true ?
а когда вызываешь скрипт то смотришь:
PHP:
if(!empty($_SESSION['logout']))
{
   header('WWW-Authenticate: Basic realm="Authorization"');
   header('HTTP/1.0 401 Unauthorized');
}
для смены же пользователя можно чтот подобное применить с сессией, либо например только урлом: script.php?newuser=[curent_user_name]
PHP:
if(!isset($_SERVER['PHP_AUTH_USER']) || (isset($_GET['newuser']) && $_GET['newuser']==$_SERVER['PHP_AUTH_USER']))
{
   header('WWW-Authenticate: Basic realm="Authorization"');
   header('HTTP/1.0 401 Unauthorized');
}
 

Фанат

oncle terrible
Команда форума
сессии, куки, и прочая пхп здесь вообще не при делах.
 

Oscar

Новичок
Года два назад какой-то человек выкладывал в этом форуме ссылку на подобный logout исключительно средствами HTTP (если я правильно понял), отсюда и желание сделать это по возможности без всего другого.

Топик искал потом не раз, так и не нашел ..

Фанат, ты знаешь, как это сделать без "прочего php" ?
 

Фанат

oncle terrible
Команда форума
человек выкладывал логаут исключительно средствами пхп.
а про пхп - это було не тебе. и поскольку ты не понял, о чём это, то и отвечать нет смысла
 

Фанат

oncle terrible
Команда форума
это было для alpes, который не понял, о чём идёт речь.
"прочий пхп" касается доступа к файлам, а не авторизации.

ключевое слово - доступ к файлам.
и это, кстати, причина того, что твоё сообщение не вызвало особого интереса.
поскольку контроль этого доступа средствами пхп получается более гибким, а технология давнлоада через пхп - отработана.
 
Сверху