Мне нужно войти, когда пользователь не может войти в веб-приложение. К сожалению, это веб-приложение не может сделать это из коробки, и я не могу это изменить.
Сейчас я экспериментирую с 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
Если веб-приложение не включает информацию об имени пользователя в перенаправление (например, в строку запроса /loginfiled.php?username=foobar
или в файл cookie), то не будет возможности извлечь имя пользователя из /loginfailed.php
запроса. Информации просто нет для извлечения. HTTP не имеет состояния, поэтому, когда клиент отправляет username=foo
тело запроса POST, и это приводит к перенаправлению 302, последующий запрос /loginfailed.php
ничего не знает о предыдущем запросе.
Если это веб-приложение использует перенаправление 307 вместо 302 или 303, то последующий запрос /loginfailed.php
будет запросом POST со всеми теми же данными. Я бы ожидал, что это будет довольно маловероятно.
Посмотрите в куки-файлах или хранилище сеансов и посмотрите, есть ли там имя пользователя. (Я не уверен, mod_security
можно ли прочитать хранилище сеансов, но если вы знаете, что оно там есть, я уверен, вы сможете что-нибудь придумать.)
Возможно, вам повезет больше CustomLog
, если вы будете регистрировать успешность или неудачу попытки входа в систему во время первоначального запроса, а не во время последующего запроса:
LogFormat "%h %t \"%r\" %>s %{Location}o %{PHPSESSID}C %{UNIQUE_ID}e" loginslog
CustomLog "/var/log/apache2/logins.log" loginslog
или вы можете просто добавить Location:
заголовок и уникальный идентификатор в ваши обычные журналы с помощью %{Location}o %{UNIQUE_ID}e
. mod_security
включает уникальный идентификатор во все свои журналы, чтобы вы могли легко сопоставлять их друг с другом.
Создание связного журнала всех имен пользователей, вход в систему с которыми не удался, заключается в извлечении всех Location:.*/loginfailed.php
строк из файла logins.log
и последующем сопоставлении уникальных идентификаторов с именами пользователей в существующем журнале на основе mod_security.