In der Apache-Log-Konfiguration kann angegeben werden, dass der HTTP-Auth-Benutzername protokolliert werden soll. Die meisten PHP-Skripte haben ihre eigene, Cookie-basierte Authentifizierung. Ist es in PHP möglich, dem Apache einen HTTP-Auth-Benutzernamen zu Protokollierungszwecken zu geben, auch wenn die Authentifizierung auf Cookies basiert? Wenn ja, wie würde der Code aussehen? Wenn nicht, welche Alternativen gibt es?
Antworten
Zu viele Anzeigen?Apache übergibt Daten zwischen Modulen in Hinweise . Wenn Sie PHP als Apache-Modul ausführen, können Sie apache_note()
um Noten zu erhalten und zu setzen. Sie können dann einschließen die %{note_name}n
Log-Format-String um dies in das Zugriffsprotokoll zu schreiben. Dadurch werden keine Daten an den Client zurückgegeben.
In PHP:
apache_note( 'username', $username );
In Ihrer Serverkonfiguration:
LogFormat "%h %l %{username}n %t \"%r\" %>s %b" common_with_php_username
CustomLog logs/access_log common_with_php_username
Seit Apache 2.4.7 erlaubt Apache das Kopieren eines Response-Headers in eine Notiz. Wenn Sie also PHP nicht als Apache-Modul laufen lassen (sondern z.B. PHP-FPM verwenden), und Sie auch nicht wollen, dass der Log-Wert an den Client gesendet wird (was normalerweise passieren würde, wenn Sie ihn in einem Response-Header setzen), gibt es hier eine Möglichkeit, dies zu tun:
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
Eine Möglichkeit besteht darin, Benutzernamen und frühere session_ids an einem anderen Ort zu speichern und das Protokoll die Cookie-Werte dorthin schreiben zu lassen (normalerweise %{PHPSESSID}C
), die Sie dann zurückverfolgen können.
Eine andere Möglichkeit wäre, einen Header mit dem Benutzernamen zurück an den Client zu senden, vorzugsweise direkt nach Ihrer session_start
:
PHP:
header('X-Php-Sess-User: '.$username);
Customlog:
%{X-Php-Sess-User}o
Wenn Sie nicht gerade einen Apache-Handler verwenden, um die internen auth*-Datenstrukturen zu berühren, können Sie am besten auf Umgebungsvariablen zurückgreifen. Sie würden eine Umgebungsvariable der obersten Ebene mit apache_setenv in Ihrem PHP-Code setzen
apache_setenv('USERID','jrodriguez',true);
und schreiben Sie dann den Wert in die Protokolldatei mit einem LogFormat-Eintrag in Ihrer Apache-Konfiguration unter Verwendung von "%{USERID}e" anstelle von "%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
Natürlich sind die echten Referenzen bei der Durchführung aktuell HTTP-Authentifizierung würde für immer verloren gehen, daher sollten Sie in Erwägung ziehen, %u woanders zu speichern - entweder in einem neuen Feld oder in einer parallelen Protokolldatei.
Ich schließe mich der Antwort von "towr" an.
header('X-Username: '.$username);
Ich wollte noch hinzufügen, warum meine Konfiguration funktioniert hat.
- En Kopfzeilen Das Apache-Modul ist erforderlich (wenn es nicht aktiviert ist, wird ein Fehler ausgegeben)
-
Die Apache-Anweisungen benötigten die 何時も opción
CustomLog logs/vhost-access_log logfmtname
copy response-header value to note
Header always note X-Username username
unset response-header so client won't get it
Header always unset X-Username