当用户无法登录 Web 应用程序时,我必须记录日志。不幸的是,此 Web 应用程序无法立即执行此操作,而且我无法更改它。
现在我正在试验 mod_security。我的想法是跟踪 POST 请求,提取用户名,然后检查用户是否被重定向到“登录失败”页面。
我有:
<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”当然已经取消设置了。
有人能提示我如何解决这个问题吗?
谢谢!
答案1
除非 Web 应用程序在重定向中包含有关用户名的信息(例如,在查询字符串/loginfiled.php?username=foobar
或 Cookie 中),否则将无法从请求中提取用户名/loginfailed.php
。这些信息根本就不存在,无法提取。HTTP 是无状态的,因此当客户端发送username=foo
POST 请求的正文并导致 302 重定向时,后续请求/loginfailed.php
对前一个请求一无所知。
如果此 Web 应用程序使用 307 重定向而不是 302 或 303,则后续请求将/loginfailed.php
是包含所有相同数据的 POST 请求。我认为这种情况不太可能发生。
查看 cookies 或会话存储,看看用户名是否在那里。(我不确定是否mod_security
可以读取会话存储,但如果你知道它在那里,我相信你可以找到办法。)
您可能更幸运地CustomLog
在原始请求而不是后续请求期间记录登录尝试是否成功或失败:
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}e
。 mod_security
在其所有日志中包含唯一 ID,以便您可以轻松地匹配其他日志。
要创建所有登录失败的用户名的连贯日志,只需从中取出所有行Location:.*/loginfailed.php
,logins.log
然后将唯一 ID 与现有的基于 mod_security 的日志中的用户名进行匹配。