Пароль на админку без .htaccess

ListOFF

Новичок
Пытаюсь сделать панель управления сайтом, т.е. по сути простейшую админку. На сервере, где размещается сайт, в httpd.conf стоит AllowOverride None, т.е. запаролить директорию с помощью .htaccess уже не получится. Нашел способ сделать в php это через заголовки. Однако в таком случае защита распространяется только на этот отдельно взятый файл, а нужно запаролить всю директорию.

Вопрос: КАК? ))
 

fixxxer

К.О.
Партнер клуба
ну у тебя же в любом случае общий инклюдник есть? ну где ты там к базе подключаешься или типа. вот в него и сунь проверку
 

ListOFF

Новичок
ну у тебя же в любом случае общий инклюдник есть?
Не понял, что такое инклюдник. Если речь об include, то можно в каждом php-файле с помощью инклюда подключать кусок php-кода, который проверяет логин-пароль. Только вот в чем проблема. Допустим, из главного файла админки я передам через POST логин-пароль, введенные в формы. Попаду на вторую страницу. А как я из второй страницы передам введенные логин-пароль на третью? Если через форму hidden, то тогда пароль будет виден в html-коде страницы.Есть, конечно, вариант всю админку написать в одном php-файле. Но это я бы не назвал выходом в такой ситуации.

tXcode, спасибо, щас почитаю. С сессиями дела еще не имел.
 

fixxxer

К.О.
Партнер клуба
ListOFF
Если ты действительно "нашел способ сделать в php это через заголовки", почитай еще раз внимательно. При basic auth браузер передает с каждым запросом заголовок, содержащий логин и пароль.
 

ListOFF

Новичок
Да, более-менее въехал в понятия сессии и передачу через заголовки.

Осталось несколько вопросов.
1.ЕСТЬ ЛИ принципиальное отличие - пользоваться сессией или только заголовками для хранения логина-пароля? И в том, и в другом случае придется писать строчку кода в каждом файле (session_start(); - для сессий, include с файлом проверки логина-пароля - в случае заголовка). И там, и там идет работа с суперглобальными переменными. Тогда в чем разница?

2.В случае сессии есть session_destroy , а как разрушить суперглобалбные переменные в случае заголовков?
 

fixxxer

К.О.
Партнер клуба
Принципиальное отличие в том, что это два разных способа. Способ с заголовками идентичен способу с .htpasswd, в этом случае браузер будет отправлять заголовок до закрытия его окна.
 

ListOFF

Новичок
Чего-то я не понял, зачем посты затёрли. Ценные были замечания. Начал отвечать - смотрю, полтемы удалили.
 

ListOFF

Новичок
Сейчас я сделал авторизацию через заголовки следующим образом. В файле head.php прописал код (логин-пароль взяты просыми, т.к. это всего лишь пример):

PHP:
<?php

if (empty($_SERVER['PHP_AUTH_USER'])) {  
	header('WWW-Authenticate: Basic realm="Closed access"');  
	header("HTTP/1.0 401 Unauthorised");  
	exit();   
} 

$login = "c4ca4238a0b923820dcc509a6f75849b";
$password = "c4ca4238a0b923820dcc509a6f75849b";
$key = false;  
if (md5($_SERVER['PHP_AUTH_USER'] === $login) && (md5($_SERVER['PHP_AUTH_PW']) === $password)) $key = true;

if(!$key) {              
	header('WWW-Authenticate: Basic realm="Closed access"');        
	header ('HTTP/1.0 401 Unauthorized');      
	exit();      
}

?>
Затем в начале всех остальных php-файлов, включая index.php,

include 'head.php';

Единственное, что пока не сделано, так это механизм закрытия админки. Была одна идея, но реализация корявая. Идеальный вариант - сбросить суперглобальные переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW']. Пробовал через unset - не получилось.
 

tXcode

Умный кодер
ListOFF
$_SERVER['QUERY_STRING'] = "";
$_SERVER['QUERY_STRING'] = null;
unset($_SERVER['QUERY_STRING']);
Выбирай.
 

ListOFF

Новичок
Написал вариант с сессией. Прошу покритиковать, указать на тонкие места.

Итак. Все страницы админки, включая главную index.php, начинаются с такой строчки:

PHP:
include 'check.php';
В check.php проверяется суперглобальная переменная $key, которая истинна только в том случае, если логин-пароль введены и введены правильно. Вот код check.php:

PHP:
<?php

session_start ();

if ($_SESSION ['key'] == false) 
	header ('Location: auth.php');
else
	print "<a href = 'close.php'>Закрыть панель администратора</a><br>\n";
?>
Если $key ложна, то происходит перенаправление на auth.php. Там форма ввода логина и пароля будет выводится, если логин-пароль введены неправильно, либо если это первый вход в админку. Как только логин-пароль введены верно, появляется соотвествующее сообщение и ссылка в главное меню админки. Вот код auth.php:
PHP:
<?php

session_start ();

function printFormEnter () {
	print <<< END
<form	method = "post"
		action = "">
<input	type = "text"
		name = "loginInput"><br>
<input	type = "password"
		name = "passwordInput"><br>
<input	type = "submit"
		value = "Отправить"><br>
</form>
END;
}

foreach ($_POST as $index => $value) {
	$$index = $value;
}
$login = "dee8dd43be7a62de96b9f30b9829ccf5";
$password = "e242f36f4f95f12966da8fa2efd59992";

if (!isset($loginInput) || !isset($passwordInput)) {
	print "Для того, чтобы войти в панель администратора, введите логин и пароль.<br>\n";
	printFormEnter ();
	exit ();
}

if (md5($loginInput) === $login && md5($passwordInput) === $password) {
	print "Вы вошли в систему. Перейдите в <a href = 'index.php'>главное меню</a>.<br>";
	$_SESSION['key'] = true;
} else {
	$_SESSION['key'] = false;
	print "Вы ввели неверную пару логин-пароль.<br>";
	printFormEnter ();
	exit (); 
}
?>
Если $key истинна при проверке в check.php, то выводится ссылка на файл close.php, который закрывает сессию. Вот код этого php-файла:
PHP:
<?php
session_start ();
session_destroy ();
print "Вы закрыли панель администратора. <br> <a href = 'auth.php'>Открыть снова панель администратора</a>.";

?>
Вот как-то так. Итого имеем три "обслуживающих" файла: auth.php, check.php и close.php и одну строчку с инклюдом в каждом файле админки.
 
Сверху