.htpasswd logout

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

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>
 
Помоему проще сейчатку глаза сканнировать и получать её по факсу. А если серьезно.... зачем? Это же неимоверный изврат. Существуют ведь сессии, которые служат не только для хранения идентификационных данных. Так что советую не изобретать одноколесный велосипед который постоянно падает.
> Вопрос: насколько это надёжно?
Идея понятна, настолько же надеждо как и традиционная сессионная. Но это изврат.
 
Как по мне то метод HTTP авторизации сам по себе содержит логаут. Закрой открытые браузеры (в IE ток дочерние) - вот тебе и будет логаут.
 
WP,

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


alpes
метод HTTP авторизации сам по себе содержит логаут
Можно поинтересоваться, как бы ты сделал, чтобы нажав на кноку "logout", можно было зайти под другим пользователем?
 
Oscar
Стопудняк просто отправил заголовоки типа WWW-Authenticate: Basic realm="Secret Zone"
HTTP/1.0 401 Unauthorized
 
а что тебе мешает вместо манипуляций с файлами писать в сессию по ссылке "выход": 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');
}
 
сессии, куки, и прочая пхп здесь вообще не при делах.
 
Года два назад какой-то человек выкладывал в этом форуме ссылку на подобный logout исключительно средствами HTTP (если я правильно понял), отсюда и желание сделать это по возможности без всего другого.

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

Фанат, ты знаешь, как это сделать без "прочего php" ?
 
человек выкладывал логаут исключительно средствами пхп.
а про пхп - это було не тебе. и поскольку ты не понял, о чём это, то и отвечать нет смысла
 
это было для alpes, который не понял, о чём идёт речь.
"прочий пхп" касается доступа к файлам, а не авторизации.

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