13 Stimmen

Benutzernamen in apache access_log mit PHP und ohne HTTP-Authentifizierung eintragen

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?

19voto

Jan Fabry Punkte 6892

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

12voto

towr Punkte 4069

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

2voto

Wrikken Punkte 66796

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

0voto

codehead Punkte 2037

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.

0voto

tsdogs Punkte 36

Ich schließe mich der Antwort von "towr" an.

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

Ich wollte noch hinzufügen, warum meine Konfiguration funktioniert hat.

  1. En Kopfzeilen Das Apache-Modul ist erforderlich (wenn es nicht aktiviert ist, wird ein Fehler ausgegeben)
  2. 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X