KP, was ich gemacht habe
Dieser Commit ist enthalten in:
32
JOURNAL.md
32
JOURNAL.md
@@ -1180,4 +1180,34 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier
|
||||
- ✅ OCSP Stapling aktiviert
|
||||
- ✅ Chrome Sicherheitswarnung behoben
|
||||
|
||||
**Hinweis:** Nach dem Rebuild des nginx Containers wird die Verbindung als sicher angezeigt.
|
||||
**Hinweis:** Nach dem Rebuild des nginx Containers wird die Verbindung als sicher angezeigt.
|
||||
|
||||
## 2025-06-08: CAPTCHA-Login-Bug behoben
|
||||
|
||||
**Problem:**
|
||||
- Nach 2 fehlgeschlagenen Login-Versuchen wurde CAPTCHA angezeigt
|
||||
- Da keine CAPTCHA-Keys konfiguriert waren (für PoC), konnte man sich nicht mehr einloggen
|
||||
- Selbst mit korrektem Passwort war Login blockiert
|
||||
- Fehlermeldung "CAPTCHA ERFORDERLICH!" erschien immer
|
||||
|
||||
**Lösung:**
|
||||
1. **CAPTCHA-Prüfung nur wenn Keys vorhanden:**
|
||||
- `recaptcha_site_key` wird vor CAPTCHA-Prüfung geprüft
|
||||
- Wenn keine Keys konfiguriert → kein CAPTCHA-Check
|
||||
- CAPTCHA wird nur angezeigt wenn Keys existieren
|
||||
2. **Template-Anpassungen:**
|
||||
- login.html zeigt CAPTCHA nur wenn `recaptcha_site_key` vorhanden
|
||||
- Kein Test-Key mehr als Fallback
|
||||
3. **Konsistente Logik:**
|
||||
- show_captcha prüft jetzt auch ob Keys vorhanden sind
|
||||
- Bei GET und POST Requests gleiche Logik
|
||||
|
||||
**Änderungen:**
|
||||
- `v2_adminpanel/app.py`: CAPTCHA-Check nur wenn `RECAPTCHA_SITE_KEY` existiert
|
||||
- `v2_adminpanel/templates/login.html`: CAPTCHA nur anzeigen wenn Keys vorhanden
|
||||
|
||||
**Status:**
|
||||
- ✅ Login funktioniert wieder nach 2+ Fehlversuchen
|
||||
- ✅ CAPTCHA wird nur angezeigt wenn Keys konfiguriert sind
|
||||
- ✅ Für PoC-Phase ohne CAPTCHA nutzbar
|
||||
- ✅ Produktiv-ready wenn CAPTCHA-Keys eingetragen werden
|
||||
1
backups/backup_v2docker_20250607_232845_encrypted.sql.gz.enc
Normale Datei
1
backups/backup_v2docker_20250607_232845_encrypted.sql.gz.enc
Normale Datei
Dateidiff unterdrückt, weil mindestens eine Zeile zu lang ist
@@ -618,8 +618,9 @@ def login():
|
||||
password = request.form.get("password")
|
||||
captcha_response = request.form.get("g-recaptcha-response")
|
||||
|
||||
# CAPTCHA-Prüfung wenn nötig
|
||||
if attempt_count >= CAPTCHA_AFTER_ATTEMPTS:
|
||||
# CAPTCHA-Prüfung nur wenn Keys konfiguriert sind
|
||||
recaptcha_site_key = os.getenv('RECAPTCHA_SITE_KEY')
|
||||
if attempt_count >= CAPTCHA_AFTER_ATTEMPTS and recaptcha_site_key:
|
||||
if not captcha_response:
|
||||
# Timing-Attack Schutz
|
||||
elapsed = time.time() - start_time
|
||||
@@ -630,7 +631,7 @@ def login():
|
||||
show_captcha=True,
|
||||
error_type="captcha",
|
||||
attempts_left=max(0, MAX_LOGIN_ATTEMPTS - attempt_count),
|
||||
recaptcha_site_key=os.getenv('RECAPTCHA_SITE_KEY'))
|
||||
recaptcha_site_key=recaptcha_site_key)
|
||||
|
||||
# CAPTCHA validieren
|
||||
if not verify_recaptcha(captcha_response):
|
||||
@@ -643,7 +644,7 @@ def login():
|
||||
show_captcha=True,
|
||||
error_type="captcha",
|
||||
attempts_left=max(0, MAX_LOGIN_ATTEMPTS - attempt_count),
|
||||
recaptcha_site_key=os.getenv('RECAPTCHA_SITE_KEY'))
|
||||
recaptcha_site_key=recaptcha_site_key)
|
||||
|
||||
# Check gegen beide Admin-Accounts aus .env
|
||||
admin1_user = os.getenv("ADMIN1_USERNAME")
|
||||
@@ -685,14 +686,14 @@ def login():
|
||||
|
||||
return render_template("login.html",
|
||||
error=error_message,
|
||||
show_captcha=(new_attempt_count >= CAPTCHA_AFTER_ATTEMPTS),
|
||||
show_captcha=(new_attempt_count >= CAPTCHA_AFTER_ATTEMPTS and os.getenv('RECAPTCHA_SITE_KEY')),
|
||||
error_type="failed",
|
||||
attempts_left=max(0, MAX_LOGIN_ATTEMPTS - new_attempt_count),
|
||||
recaptcha_site_key=os.getenv('RECAPTCHA_SITE_KEY'))
|
||||
|
||||
# GET Request
|
||||
return render_template("login.html",
|
||||
show_captcha=(attempt_count >= CAPTCHA_AFTER_ATTEMPTS),
|
||||
show_captcha=(attempt_count >= CAPTCHA_AFTER_ATTEMPTS and os.getenv('RECAPTCHA_SITE_KEY')),
|
||||
attempts_left=max(0, MAX_LOGIN_ATTEMPTS - attempt_count),
|
||||
recaptcha_site_key=os.getenv('RECAPTCHA_SITE_KEY'))
|
||||
|
||||
|
||||
@@ -100,9 +100,9 @@
|
||||
<input type="password" class="form-control" id="password" name="password" required>
|
||||
</div>
|
||||
|
||||
{% if show_captcha %}
|
||||
{% if show_captcha and recaptcha_site_key %}
|
||||
<div class="mb-3">
|
||||
<div class="g-recaptcha" data-sitekey="{{ recaptcha_site_key|default('6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI') }}"></div>
|
||||
<div class="g-recaptcha" data-sitekey="{{ recaptcha_site_key }}"></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if show_captcha %}
|
||||
{% if show_captcha and recaptcha_site_key %}
|
||||
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
|
||||
{% endif %}
|
||||
</body>
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren