让apache在无效的htdigest (http身份验证)登录时向PHP脚本发出信号的最佳方法


best way to have apache signal a php script on invalid htdigest (http authentication) logins?

所以,我们的源代码库中有几个文件夹是受htdigest保护的。

我们想通过我们自己的自定义PHP处理程序记录无效的登录。

我希望通过apache ErrorDocument指令做到这一点。

我想我的问题是两层的

a)将apache ErrorDocument指令指向php脚本是否有效,它是否会被解析为php脚本(假设php已经启动并运行)

b)我在http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html上快速查看了http状态码列表。


10.4.2 401 Unauthorized

请求需要用户身份验证。响应必须包含一个WWW-Authenticate报头字段(章节14.47),其中包含一个适用于请求资源的挑战。客户端可以用合适的授权报头字段重复请求(章节14.8)。如果请求已经包含Authorization凭据,则401响应指示拒绝对这些凭据进行授权。如果401响应包含与前一个响应相同的挑战,并且用户代理已经尝试了至少一次身份验证,那么应该向用户显示响应中给出的实体,因为该实体可能包含相关的诊断信息。HTTP访问认证详见"HTTP认证:基本和摘要访问认证"[43]。


这使它听起来好像流过程,从一个基于浏览器的用户代理将如下:

a) user hits protected url
b) apache responds with a 401 status code
c) user is presented by useragent with username + password prompt

我们只想记录无效的登录,而不是不知道(尚未)该页面需要身份验证的点击。

基本上是

,我将在这里做一点复制粘贴,但我们想要的是一个自定义的,基于PHP的替换以下内容:

Authorization Required
This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.

我们不想做的事:

a)被告知我们应该在这种情况下使用一个完整的基于PHP的登录系统。这已经完成了,身份验证是两层的。用户必须通过基于web的登录(基于会话)登录到服务。第二层认证是基于HTTP的认证。

b)被告知设置一个完全自定义的基于PHP的HTTP身份验证处理程序。是的,我知道这是可能的,而且很容易,但我希望把实际的htdigest处理留给apache。但是,如果把HTTP认证处理交给apache是不可能的,那么我们将不得不这样做。


所以总结:是否有可能让apache解析一个基于PHP的脚本无效的htdigest登录(但不缺乏),所以我们可以在该脚本(日志,IP块,等等…)?

就我们所知,下面的方法是有效的。即使基于htdigest的身份验证即将过期:

a)将errordocument401指向基于php的脚本。

b)我们的php 401脚本如下所示:
<?
if(isset($_SERVER['REDIRECT_REMOTE_USER'])){
    logError('authentication','invalid login attempt to '.(isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:'unknown').' using username '.$_SERVER['REDIRECT_REMOTE_USER']);
}
header($_SERVER['SERVER_PROTOCOL'].' 401 Authorization Required',true);
header('Status: 401 Authorization Required',true);
?>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>401 Authorization Required</title> 
</head><body> 
<h1>Authorization Required</h1> 
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p> 
</body></html>

logError函数是我们的自定义函数,但是你可以用任何你喜欢的东西替换它/在里面添加一些进一步的动作。

享受吧!