Поместите имя пользователя в apache access_log с PHP и без аутентификации HTTP - PullRequest
9 голосов
/ 02 августа 2010

В конфигурации журнала Apache можно указать, что имя пользователя авторизации HTTP должно быть зарегистрировано.Большинство сценариев PHP имеют собственную аутентификацию на основе файлов cookie.Возможно ли в PHP предоставить Apache HTTP-имя пользователя для авторизации, даже если аутентификация основана на использовании файлов cookie?Если да, как будет выглядеть код?Если нет, каковы альтернативы?

Ответы [ 4 ]

12 голосов
/ 21 июля 2011

Apache передает данные между модулями в примечаниях . Если вы запускаете PHP как модуль Apache, вы можете использовать apache_note() для получения и установки заметок. Затем вы можете включить %{note_name}n строку формата журнала , чтобы записать это в журнал доступа. Это не приведет к утечке данных обратно клиенту.

В PHP:

apache_note( 'username', $username );

В конфигурации вашего сервера:

LogFormat "%h %l %{username}n %t \"%r\" %>s %b" common_with_php_username
CustomLog logs/access_log common_with_php_username
7 голосов
/ 27 сентября 2014

Начиная с Apache 2.4.7, Apache позволяет копировать заголовок ответа в заметку.Поэтому, если вы не запускаете PHP как модуль Apache (но, например, используете PHP-FPM), и вы также не хотите, чтобы log-значение отправлялось клиенту (что обычно происходит, если вы установите его взаголовок ответа), вот способ сделать это:

php:

header('X-Username: '.$username);

httpd.conf:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{username}n\"" logfmtname

vhost.conf:

CustomLog logs/vhost-access_log logfmtname

# copy response-header value to note
Header note X-Username username
# unset response-header so client won't get it
Header unset X-Username
2 голосов
/ 02 августа 2010

Существует возможность сохранить имена пользователей и прошлые идентификаторы сеанса где-нибудь еще, и позволить журналу записать в них значения cookie (обычно %{PHPSESSID}C), которые затем можно отследить.

Другой вариант - отправить заголовок с именем пользователя обратно клиенту, желательно сразу после вашего session_start:

PHP:

header('X-Php-Sess-User: '.$username);

Customlog:

%{X-Php-Sess-User}o
0 голосов
/ 02 августа 2010

Если не использовать обработчик Apache для прикосновения к внутренним структурам данных auth *, лучше всего прибегнуть к переменным среды. Вы должны установить переменную окружения верхнего уровня, используя apache_setenv в своем коде PHP

apache_setenv('USERID','jrodriguez',true);

, а затем запишите значение в файл журнала с записью LogFormat в конфигурации Apache, используя "% {USERID} e" вместо "% u"

LogFormat "%v:%p %h %l %{USERID}e %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" envuid_combined
CustomLog /path/to/access.log envuid_combined

Конечно, реальные учетные данные при выполнении фактического HTTP-аутентификации будут потеряны навсегда, поэтому рассмотрите возможность сохранения% u где-нибудь еще - либо в новом поле, либо в параллельном файле журнала.

...