>Написал на php страничку, вход в которую возможен только после ввода пароля,
>кроме того имеются три пары логин/пароля от которого зависят содержимое странички.
>
>Код такой:
>function http_auth()
>{
!2> $_SESSION['AUTH'] = 1;
> header('HTTP/1.0 401 Unauthorized');
!1> header('WWW-Authenticate: Basic realm="Welcome to company"');
> // The actions to be done when the
>user clicks on 'cancel'
> echo "Unauthorized";
> exit();
>}
(кут)
>
>Сегодня обнаружил, что когда на диалоговом окне нажимаешь Отмена, затем из браузера
>Назад, а потом опять идешь по ссылке страница открывается без запроса
>пароля.
>Как это запретить?????
Всё очень просто.
В месте !1 ты объявляешь заголовок аутентификации. Поэтому прошла она или нет, параметр PHP_AUTH_USER заполняется. И я так подозреваю что в случае "Отмена-Назад-Вперед" она заполняется пустой строкой. Но пустая строка это всё-таки isset($var). Поэтому ты по сути два раза (см. !2) делаешь одну и ту же проверку.
Можно проверку заменить. В голову приходит два варианта:
1. if( empty($_SERVER['PHP_AUTH_USER']) )
здесь есть два ньюанса.
- Во-первых в случае error_reporting(E_ALL & E_NOTICE) ты получишь замечание что индекс PHP_AUTH_USER не определен при первом заходе на страницу. Обходится так:
if (!isset($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_USER']))...
)
- Во-вторых ... а кто его знает, мало ли - есть фича/бага прохождения аутентификации с пустым логином. Обходится проверкой логина.
if ( !myCheckLogin($_SERVER['PHP_AUTH_USER']) )...,
где myCheckLogin($str) это что-то вроде return in_array($str, $correctLogins);
2. таки использовать $_SESSION['AUTH']. Т.е.
if ($_SERVER['PHP_AUTH_USER']=="login1" && $_SERVER['PHP_AUTH_PW']=="pass1") {
$ip=$login;
$_SESSION['AUTH'] = 1;
...
,... для других паролей то же самое
а в проверке:
if ( !isset($_SESSION['AUTH']) || ( -1 != $_SESSION['AUTH'] ) )...отказ
Надеюсь что-то можно разобрать... может быть не очень понятно объяснил, могу показать на полном коде. l4igem(два)(кусака)list(тчк)ру