Markus Michalski FAQ

ALTCHA Spam-Schutz: Challenge-Endpunkt

Challenge-Endpunkt des ALTCHA Spam-Schutz Moduls für OXID 7: Aufruf, JSON-Antwort, HTTP-Statuscodes, Rate Limit, Aufbau der Lösung im POST-Feld altcha und die serverseitige Prüfung.

English Version

Zurück zur Übersicht

ALTCHA Spam-Schutz: Challenge-Endpunkt

Live Demo: Teste dieses und weitere Plugins live — ohne Installation, ohne Risiko: demo.markus-michalski.net

Das Modul stellt einen einzigen Endpunkt bereit: den Controller mmd_altcha_challenge, der eine neue Challenge für das Widget erzeugt. Das Widget ruft ihn automatisch auf, du musst ihn nur selbst ansprechen, wenn du das Widget ersetzt.

Aufruf

GET index.php?cl=mmd_altcha_challenge&fnc=getChallenge

Die vollständige URL liefert oViewConf.getAltchaChallengeUrl() (siehe Storefront). Die Antwort ist immer JSON mit den Headern Content-Type: application/json; charset=utf-8 und Cache-Control: no-store, no-cache, must-revalidate.

Antwort

{
    "algorithm": "SHA-256",
    "challenge": "9f2c...",
    "salt": "a1b2c3d4e5f6a1b2c3d4e5f6.1760000000",
    "signature": "7d3e...",
    "maxnumber": 50000
}
Feld Inhalt
algorithm Immer SHA-256
challenge SHA-256-Hash aus salt und einer geheimen Zufallszahl zwischen 1 und maxnumber
salt 24 zufällige Hex-Zeichen, Punkt und Unix-Zeitstempel der Erzeugung
signature HMAC-SHA256 der challenge mit dem HMAC-Geheimschlüssel des Moduls
maxnumber Wert der Einstellung "Maximale Zahl (Schwierigkeit)"

Der Server speichert ausgegebene Challenges nicht. Gespeichert wird erst eine gelöste und geprüfte Challenge (Schutz vor Wiederverwendung).

Statuscodes

Status Bedeutung Antwortkörper
200 Challenge erzeugt Challenge-JSON (siehe oben)
503 Spam-Schutz oder ALTCHA ist ausgeschaltet {"error":"ALTCHA is disabled"}
429 Rate Limit des Endpunkts überschritten, Header Retry-After enthält die Sekunden {"error":"Too many requests"}
500 Interner Fehler {"error":"Challenge generation failed"} im Produktivmodus, sonst die Meldung der Ausnahme

Das Rate Limit des Endpunkts wird pro Client-Adresse gezählt, ist über "Challenge-Endpoint Rate Limit" schaltbar und hat die Standardwerte 30 Anfragen in 60 Sekunden (siehe Konfiguration). Das Zeitfenster wird intern auf volle Minuten aufgerundet. Nur erlaubte Anfragen werden mitgezählt. Der Wert in Retry-After ist das eingestellte Zeitfenster in Sekunden.

Lösung beim Absenden

Das Widget löst die Aufgabe im Browser und schickt das Ergebnis im POST-Feld altcha mit. Der Wert ist ein Base64-kodiertes JSON mit den Feldern algorithm, challenge, number, salt und signature. Der Server liest ausschließlich dieses Feld, einen Header gibt es nicht.

Die Prüfung läuft in dieser Reihenfolge, beim ersten Fehler wird abgelehnt:

  1. Das Feld altcha ist vorhanden, gültiges Base64 und gültiges JSON mit allen fünf Feldern.
  2. algorithm ist SHA-256.
  3. signature stimmt mit dem HMAC der challenge überein.
  4. Der Zeitstempel im salt ist nicht älter als "Challenge-Gültigkeit (Sekunden)".
  5. Der SHA-256-Hash aus salt und number entspricht der challenge.
  6. Die challenge wurde noch nie verwendet. Sie wird dabei als verbraucht eingetragen, auch wenn danach das Rate Limiting die Absendung ablehnt.

Client-Adresse

Für das Rate Limiting wird der erste Eintrag des Headers X-Forwarded-For verwendet, sonst REMOTE_ADDR. Mehr dazu auf der Seite Datenschutz.