使用PHP并且不使用HTTP身份验证将用户名放在apache access_log中

时间:2010-08-02 15:24:02

标签: php apache http authentication logging

在Apache日志配置中,可以指定应记录HTTP身份验证用户名。大多数PHP脚本都有自己的基于cookie的身份验证。是否有可能在PHP中为Apache提供HTTP auth用户名以进行日志记录,即使身份验证是基于cookie的?如果是,代码将如何?如果没有,有什么替代方案?

5 个答案:

答案 0 :(得分:12)

Apache在 notes 中的模块之间传递数据。如果您将PHP作为Apache模块运行,则可以使用apache_note()来获取和设置注释。然后,您可以包含the %{note_name}n log format string将其写入访问日志。这不会将任何数据“泄漏”回客户端。

在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

答案 1 :(得分:7)

由于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

答案 2 :(得分:2)

可能存储用户名&过去其他地方的session_ids,并让日志在其中写入cookie值(通常为%{PHPSESSID}C),然后您可以追溯到该值。

另一种选择是将带有用户名的标题发送回客户端,最好是在session_start之后:

PHP:

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

的CustomLog:

%{X-Php-Sess-User}o

答案 3 :(得分:0)

如果不使用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保存在其他位置 - 无论是在新字段还是在并行日志文件中。

答案 4 :(得分:0)

我第二个“拖”回答

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

我虽然会添加使我的配置工作的原因。

  1. headers apache 模块是必需的(如果未启用它会引发错误)
  2. apache 语句需要always 选项
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