Лучший способ заставить apache сигнализировать скрипт php о недействительных логинах htdigest (http-аутентификации)?
Итак, у нас есть несколько папок в нашей исходной базе, которые защищены htdigest.
мы хотели бы регистрировать неверные имена входа через наш собственный обработчик php.
я надеялся сделать это через директиву apache ErrorDocument.
так что я думаю, мой вопрос двухуровневый.
а) допустимо ли указывать директиву apache ErrorDocument на php-сценарий, и будет ли он анализироваться как php-сценарий (при условии, что php запущен для указанного httpd).
б) я быстро взглянул на список кодов http http: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.
10.4.2 401 Несанкционированный
Запрос требует аутентификации пользователя. Ответ ДОЛЖЕН включать поле заголовка WWW-Authenticate (раздел 14.47), содержащее запрос, применимый к запрашиваемому ресурсу. Клиент МОЖЕТ повторить запрос с подходящим полем заголовка Авторизация (раздел 14.8). Если в запрос уже включены учетные данные авторизации, то ответ 401 указывает, что в авторизации было отказано для этих учетных данных. Если ответ 401 содержит ту же проблему, что и предыдущий ответ, и пользовательский агент уже предпринял попытку аутентификации, по крайней мере, один раз, тогда пользователю СЛЕДУЕТ представить объект, который был указан в ответе, поскольку этот объект может включать в себя соответствующую диагностическую информацию. Аутентификация доступа HTTP объясняется в разделе "Аутентификация HTTP: базовая и дайджест-аутентификация доступа" [43].
Это звучит так, как если бы процесс проходил через браузер, который будет выглядеть следующим образом:
a) user hits protected url
b) apache responds with a 401 status code
c) user is presented by useragent with username + password prompt
мы хотим регистрировать только недействительные входы в систему, а не попадания, которые не знают (пока), что страница требует проверки подлинности.
в основном, и здесь я сделаю небольшую вставку копии, но нам нужна пользовательская замена на основе php для следующего:
Authorization Required
This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.
что мы не хотим делать:
а) вам скажут, что в этом случае мы должны использовать полную систему входа в систему на основе php. это уже сделано, аутентификация двухуровневая. Пользователь должен войти в сервис через веб-интерфейс (на основе сеанса). и 2-й уровень аутентификации - аутентификация на основе http.
b) чтобы настроить полностью настроенный обработчик аутентификации http на основе php. да, я знаю, что это возможно, и довольно легко, но я бы хотел оставить фактическую обработку htdigest в руках апачей. но, если оставить обработку http-аутентификации в руках apache невозможно, это в конечном итоге будет тем, что нам придется сделать.
Итак, подведем итоги: возможно ли, чтобы apache анализировал скрипт на основе php на недопустимые логины htdigest (но их там не было), чтобы мы могли действовать в этом скрипте (log, ip block и т. д.)?
1 ответ
Насколько мы можем судить, следующий метод работает. Даже с истекающей аутентификацией на основе htdigest:
а) Укажите ErrorDocument 401 на скрипт на основе php.
б) Наш скрипт php 401 выглядит следующим образом:
<?
if(isset($_SERVER['REDIRECT_REMOTE_USER'])){
logError('authentication','invalid login attempt to '.(isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:'unknown').' using username '.$_SERVER['REDIRECT_REMOTE_USER']);
}
header($_SERVER['SERVER_PROTOCOL'].' 401 Authorization Required',true);
header('Status: 401 Authorization Required',true);
?>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Authorization Required</title>
</head><body>
<h1>Authorization Required</h1>
<p>This server could not verify that you
are authorized to access the document
requested. Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>
Функция logError - это наша пользовательская функция, но вы можете заменить ее на что угодно или добавить некоторые дополнительные действия.
Наслаждайтесь!