mod_security:跟踪用户检查是否redirectlogin失败的页面

当用户无法login到Web应用程序时,我必须logging。 不幸的是,这个Web应用程序无法做到这一点,我不能改变它。

现在我正在试验mod_security。 我的想法是跟踪POST请求,提取用户名,然后检查用户是否被redirect到“login失败”页面。

我有:

<Location /login.php> # Sanitize password variable value SecAction nolog,phase:2,sanitiseArg:password SecRule REQUEST_BODY "username=(.*)&password" "capture,log,logdata:'login submitted: user %{TX.1}'" </Location> 

 <Location /loginfailed.php> # Filter und log redirects to loginfailed SecRule RESPONSE_BODY "loginfailed.php" "phase:4,t:none,log,logdata:'login failed: %{TX.1}'" </Location> 

但是当然,当我第二次需要的时候,“TX.1”已经不存在了。

任何人都可以给我一个关于如何解决这个问题的提示吗?

谢谢!

除非Web应用程序在redirect中包含有关用户名的信息(比如说,在查询string/loginfiled.php?username=foobar或cookie中),否则将无法从/loginfailed.php请求中提取用户名。 这些信息并不是要提取的。 HTTP是无状态的,所以当一个客户端在POST请求的主体中发送username=foo并且这导致302redirect时,对/loginfailed.php的后续请求不知道关于先前请求的任何内容。

如果这个网页应用程序使用307redirect而不是302或303,则对/loginfailed.php的后续请求将是一个包含所有相同数据的POST请求。 我预计这是相当不可能的。

看看cookie或会话存储,看看用户名是否在那里。 (我不确定mod_security可以读取会话存储,但如果你知道它在那里,我相信你可以找出一些东西。)

您可能会有更多的运气与CustomLoglogging在原始请求中login尝试成功或失败,而不是跟进请求:

 LogFormat "%h %t \"%r\" %>s %{Location}o %{PHPSESSID}C %{UNIQUE_ID}e" loginslog CustomLog "/var/log/apache2/logins.log" loginslog 

或者您可以将Location:标题和唯一ID添加到正常日志中,并使用%{Location}o %{UNIQUE_ID}emod_security在其所有日志中都包含唯一的ID,因此您可以轻松地将其匹配到其他日志中。

为login失败的所有用户名创build一个连贯的日志,然后将所有的Location:.*/loginfailed.php行输出logins.log ,然后将唯一的ID匹配到现有基于mod_security的用户名login。