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.
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:
- Das Feld
altchaist vorhanden, gültiges Base64 und gültiges JSON mit allen fünf Feldern. algorithmistSHA-256.signaturestimmt mit dem HMAC derchallengeüberein.- Der Zeitstempel im
saltist nicht älter als "Challenge-Gültigkeit (Sekunden)". - Der SHA-256-Hash aus
saltundnumberentspricht derchallenge. - Die
challengewurde 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.