Как перехватывать действие после неудачной HTTP-авторизации?

Кинотавр

Новичок
Как перехватывать действие после неудачной HTTP-авторизации?

В мемберс-ареа используется HTTP-авторизация согласно приведенному ниже коду.

PHP:
if (!isset($_SERVER['PHP_AUTH_USER']))
{
  Header ("WWW-authenticate: Basic realm=\"Members Area\"");
  Header ("HTTP/1.0 401 Unauthorized");
  exit;
}
else
{
  $pwdfile = "../users/".$_SERVER['PHP_AUTH_USER']."/htpasswd";

  if (file_exists($pwdfile))
  {
    $fd = fopen($pwdfile,"r");
    $password = trim(fread($fd,filesize($pwdfile)));
    fclose($fd);
  }
     
  if (md5($_SERVER['PHP_AUTH_PW'])!=$password)
  {
    Header ("WWW-authenticate: Basic realm=\"Members Area\"");
    Header ("HTTP/1.0 401 Unauthorized");
    exit;
  }

  $user_nick = $_SERVER['PHP_AUTH_USER'];

// Далее несколько строк записи лога авторизации юзера
}
Программа пишет лог с записью таймстампа, IP-адреса, хоста и др. После успешной авторизации он записывается нормально. Но надо чтобы еще писались и неудачные попытки авторизации, для последующего анализа. Но, судя по моим опытам, HTTP-авторизация при неудачной попытке выводит лишь пустое белое содержимое броузера. Под неудачной попыткой подразумевается введенный трижды неправильный логин/пароль или нажатие "Отмена". В обоих случаях выводится пустота.

Вопрос: как перехватывать неудачную попытку авторизации (тройной неправильный ввод или Отмена), чтобы можно было записать лог с информацией о неудачной авторизации?

Спасибо.
 

Yurik

/dev/null
HTTP-авторизация при неудачной попытке выводит лишь пустое белое содержимое броузера
она выводит то что стоит под
PHP:
  Header ("WWW-authenticate: Basic realm=\"Members Area\""); 
  Header ("HTTP/1.0 401 Unauthorized");
НО если в ИЕ стоит "Выводить подробные сообщения об ошибках" (а так и есть по умолчанию) и длина этого сообщения меньше 1 кб, то он считает встроенные сообщения более побдробными и игнорирует Ваши.

Под неудачной попыткой подразумевается введенный трижды неправильный логин/пароль
это сделано только в ИЕ.

нажатие "Отмена".
нажатие отмена приводит к тому что броузер не посылает никаких запросов

Неудачная попытка - это ЛЮБОЙ запрос в котором не указан правильный логин или пароль.
Вся ветвь после if (!isset($_SERVER['PHP_AUTH_USER'])) - действия в случае неудачной попытки.
Перед exit; можно вставить запись в базу

Но эта ветвь запускается даже когда впервые выводится окошко для пароля (по сути в ХТТП авторизации первый заход всегда неудачный и сервер посылает инструкции чтобы сделать последующие заходы удачными)
Поэтому нужно использовать куку в которой хранить попытку. Если она больше N - писать в базу
 

Кинотавр

Новичок
То есть, я так понял, что перед первым "exit;" ставить запись в лог - это когда вообще не ввели логин/пароль, а перед вторым - это когда он неправильный. То есть, таким образом мы перехватываем те события, которые вновь приводят к появлению окошка с приглашением ввести логин. Хорошо. А как перехватить событие, которое проявляется после третьей неудачной попытки авторизации - вывод белого окна без приглашения к логину? Те же самые "exit;" ?

И еще, каким образом обрабатывать нажатие Отмены? Вы говорите, что броузер не посылает никаких запросов. Но ведь он все равно выводит белый экран.
Никак нельзя перехватывать?
 

Yurik

/dev/null
белый экран или вообще отсуствие устройства ввода-вывода - это проблема клиента. Авторизация потекает так:

В любом запросе (понятие 1-ый 2-ой запрос не существует) проверяется наличие заголовков с логином и паролем, если их нет, то посылается заголовки, указывающие что нужно дать логин и пароль.

Что делает типичный броузер:
когда получает заголовок с требованием авторизоваться выводит окошко логина/пароля и если нажать ОК посылает повторный запрос на тот же УРЛ но уже с логином/паролем.
Если не нажать на ОК (отмена), то он выведет сообщение которое следует за заголовками.

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

Но ведь он все равно выводит белый экран.
Никак нельзя перехватывать?
никак
То есть, я так понял, что перед первым "exit;" ставить запись в лог - это когда вообще не ввели логин/пароль, а перед вторым - это когда он неправильный.
да
как перехватить событие, которое проявляется после третьей неудачной попытки авторизации - вывод белого окна без приглашения к логину?
если это ИЕ, то кинуть туда сообщение мол "невдача спиткала ижачка" и поставить мета-рефреш на 0 секунд на свой скрипт файлуре-трекера.
Но повторяю попытки считает только ИЕ (их к-во вроде даже меняется в реестре) и вы их можете считать только через куки
 
Сверху