簡體   English   中英

使用PHP並且不使用HTTP身份驗證將用戶名放在apache access_log中

[英]Put username in apache access_log with PHP and without HTTP auth

在Apache日志配置中,可以指定應記錄HTTP身份驗證用戶名。 大多數PHP腳本都有自己的基於cookie的身份驗證。 是否有可能在PHP中為Apache提供HTTP auth用戶名以進行日志記錄,即使身份驗證是基於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),並且您也不希望將日志值發送到客戶端(如果您將其設置為response-header),這是一種方法:

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處理程序來觸及內部auth *數據結構,最好的辦法是求助於環境變量。 您可以在PHP代碼中使用apache_setenv設置頂級環境變量

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

然后使用“%{USERID} e”而不是“%u”將值寫入Apache配置中的LogFormat條目的日志文件中

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保存在其他位置 - 無論是在新字段還是在並行日志文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM