Поместите имя пользователя в apache access_log с PHP и без HTTP auth

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

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 

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

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 

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

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

PHP:

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

CustomLog:

 %{X-Php-Sess-User}o 

Если вы не используете обработчик Apache для привязки к внутренним структурам данных *, лучше всего прибегнуть к переменным среды. Вы должны установить переменную среды верхнего уровня, используя 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 в другом месте – либо в новом поле, либо в файле параллельного журнала.