Anti-Cheat: server-autoritative Runden (blindes Treffer-Spam wirkungslos)

Der Server bestimmt pro Runde Ziel + alle Items (mit zufaelligen IDs) und validiert
jeden Treffer gegen die Ziel-ID der aktuellen Runde (nonce + itemId). Blindes Spammen
von /api/game/hit bringt damit 0 Punkte. Zusaetzlich Reaktionszeit-Untergrenze und
Mindestabstand; Score weiterhin nach Spielzeit gedeckelt.

- Server: makeRound() + /api/game/start liefert erste Runde, /api/game/hit erwartet
  {nonce,itemId} und gibt bei korrektem Treffer die naechste Runde zurueck
- Client: rendert server-gelieferte Runden, sendet geklickte itemId, Vorschub nur bei
  Server-Bestaetigung (Sofort-Flash fuers Gefuehl)
- README: Ban-Befehle dokumentiert, Anti-Cheat-Abschnitt aktualisiert

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-05 12:39:19 +02:00
parent 8dbff16cec
commit 221cba417f
3 changed files with 143 additions and 72 deletions

View File

@@ -53,11 +53,14 @@ In `public/js/app.js` oben:
- Zwei Boards: **Hall of Fame** (Allzeit-Top-5) + **Heute** (Top-10). Gespeichert in
`data/leaderboard.json` (wird automatisch angelegt, überlebt Neustarts).
- **Anti-Cheat:** Der Score ist server-autoritär — der Server vergibt zu Spielbeginn eine
Session (`/api/game/start`), zählt jeden gemeldeten Treffer (`/api/game/hit`) mit
Mindestabstand (gegen Auto-Klicker) und deckelt nach echter Spielzeit. Beim Eintragen
(`/api/score`) zählt **nur** diese Server-Zahl; ein Score ohne gültige Session wird
abgelehnt. Namen werden beim Anzeigen escaped (kein XSS).
- **Anti-Cheat:** **server-autoritative Runden.** Der Server bestimmt pro Runde das Ziel
und alle Items (mit zufälligen IDs) und validiert jeden Treffer gegen die Ziel-ID der
*aktuellen* Runde (`/api/game/hit` mit `nonce` + `itemId`). Blindes „Treffer-Spam"
bringt dadurch nichts mehr; zusätzlich Reaktionszeit-Untergrenze, Mindestabstand und
Deckelung nach echter Spielzeit. Beim Eintragen (`/api/score`) zählt **nur** die
server-gezählte Trefferzahl. Namen werden beim Anzeigen escaped (kein XSS).
> Hinweis: In einem Browserspiel bekommt der Client zwangsläufig die Renderdaten —
> ein eigens gebauter Solver-Bot bleibt theoretisch möglich, 100 % dicht geht nicht.
## Verwaltung per CLI
@@ -70,6 +73,11 @@ node server/admin.js delete "Name" # einen bestimmten Spieler löschen
node server/admin.js clear-today # nur die heutige Rangliste leeren
node server/admin.js clear-all # komplette Rangliste leeren
# Bannen (namensbasiert, case-insensitiv)
node server/admin.js ban "Name" # sperren (+ vorhandene Einträge entfernen)
node server/admin.js unban "Name" # Sperre aufheben
node server/admin.js bans # gebannte Namen anzeigen
# Betriebsmodus (wirkt SOFORT, ohne Neustart)
node server/admin.js mode # aktuellen Modus anzeigen
node server/admin.js mode public # Spiel öffentlich unter "/"