ユーザーが 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>
しかし、もちろん、2 回目に必要になったときには、「TX.1」はすでに設定されていません。
これを解決する方法についてヒントをくれる人はいますか?
ありがとう!
答え1
Web アプリがリダイレクトにユーザー名に関する情報 (クエリ文字列/loginfiled.php?username=foobar
または Cookie など) を含めない限り/loginfailed.php
、リクエストからユーザー名を抽出する方法はありません。抽出する情報が存在しないのです。HTTP はステートレスなので、クライアントがusername=foo
POST リクエストの本文を送信し、その結果 302 リダイレクトが発生した場合、後続のリクエストは/loginfailed.php
前のリクエストについて何も知りません。
この Web アプリが 302 または 303 ではなく 307 リダイレクトを使用する場合、後続のリクエストは/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:
または、 . を使用して通常のログにヘッダーと一意の IDを追加することもできます%{Location}o %{UNIQUE_ID}e
。 ではmod_security
すべてのログに一意の ID が含まれるため、簡単に照合できます。
ログインに失敗したすべてのユーザー名の一貫したログを作成するには、すべてLocation:.*/loginfailed.php
の行をgrep しlogins.log
、一意の ID を既存の mod_security ベースのログ内のユーザー名と照合するだけです。