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:
18
README.md
18
README.md
@@ -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 "/"
|
||||
|
||||
Reference in New Issue
Block a user