Worum es geht
Die Endpunkte unter /cias/registration/** sind ohne Anmeldung erreichbar. Jeder im Internet kann sie aufrufen, auch jemand, der herausfinden will, welche Adressen bei euch ein Konto haben, oder der massenhaft Mandanten anlegen will. Deshalb verraten diese Endpunkte so wenig wie möglich und sind gedrosselt.
Was ein Angreifer sieht
- Antwort 202
accepted - Mail: „Bitte bestätigen Sie Ihre Adresse“
- Antwort 202
accepted - Mail: Einladung zum Beitritt oder „Sie haben bereits ein Konto“
- Antwort 429
- keine Mail
Ein Angreifer sieht nur die Antworten, nicht die Mails. Für ihn sehen neue und bekannte Adressen gleich aus.
Die Antworten der öffentlichen Endpunkte
| Endpunkt | Antwort | Wann |
|---|---|---|
POST /self | 202 accepted | angenommen, egal ob die Adresse bekannt ist |
| 400 | Adresse ungültig oder Anfrage kaputt | |
| 422 | Pflichtfeld fehlt, unbekanntes Feld, oder ein Hook lehnt ab | |
| 429 | gedrosselt | |
POST /verify, POST /invitations/accept | 202 accepted | eingelöst, oder schon früher eingelöst |
| 404 | Link unbekannt, oder abgelaufen, solange der Vorgang noch wartet | |
GET /invitations/{token}/form | 200 oder 404 | offene Felder, oder Link unbekannt |
GET /flows/{flow}/form | 200 | Feldbeschreibung eines Ablaufs |
Alle Fehler haben dasselbe Format: { "error": "cias.registration.…", "message": "…" }.
Warum liefert ein zweiter Klick 202 und keinen Fehler? Viele Mailprogramme öffnen Links vorab, um sie auf Schadsoftware zu prüfen. Dabei wird das Token schon eingelöst, bevor die Person klickt. Ein Fehler beim echten Klick würde sie verwirren. Siehe E-Mail bestätigen.
Die Drosselung
Die Selbstregistrierung zählt Versuche in einem gleitenden Zeitfenster. Ist die Grenze erreicht, antwortet CIAS mit 429, bevor es irgendetwas prüft oder anlegt.
Wann: immer
Höchstens rate-limit Versuche je Adresse in rate-limit-window. Standard und cias-runtime: 10 in 10 Minuten. Der Hub stellt 3 je Stunde ein.
Ergebnis: Schützt das Postfach einer Person davor, mit Mails geflutet zu werden.
Wann: Die Installation stellt client-ip-source auf REMOTE_ADDR oder HEADER.
Ein zweiter Zähler je Absender-IP. Die IP wird nie gespeichert, sondern mit einem Salz gehasht. Bei HEADER nimmt CIAS den ersten Eintrag des eingestellten Headers, etwa X-Forwarded-For. Der Hub stellt HEADER ein, mit 20 Versuchen in 10 Minuten. In cias-runtime ist dieser Zähler aus.
Ergebnis: Schützt davor, dass jemand von einem Rechner aus viele verschiedene Adressen durchprobiert.
POST /cias/registration/self (11. Versuch in 10 Minuten)429
{ "error": "cias.registration.rate-limited", "message": "too many attempts" }Die Antwort sagt absichtlich nicht, wann es wieder geht. Es gibt keinen Header Retry-After. Wer wartet, kommt wieder durch; wer es automatisch versucht, bekommt keinen Takt vorgegeben.
Die Verwaltungs-Endpunkte (Anlage durch Administratoren, Einladungen) sind nicht gedrosselt. Dort ist der Aufrufer angemeldet und bekannt.