Schutz im Browser¶
KCForms schützt die Anwender mit mehreren Mechanismen, die im Browser wirken. Die meisten brauchen keine Einstellung. Diese Seite erklärt, was sie tun, und wo du eingreifen musst, wenn du KCForms in ein Portal einbettest oder eigene Programme an die Schnittstelle anbindest.
Schutz gegen untergeschobene Anfragen (CSRF)¶
Jede ändernde Anfrage an KCForms — Speichern, Löschen, Einstellungen ändern, Abmelden — muss ein Token tragen, das zur Sitzung gehört. Eine fremde Seite, die der angemeldete Anwender gerade geöffnet hat, kennt dieses Token nicht und kann deshalb nichts in seinem Namen auslösen. Das gilt auch für Seiten auf einer anderen Adresse derselben Firmendomain.
Die KCForms-Oberfläche erledigt das selbst; du musst nichts einstellen.
Eigene Programme, die mit einer Anmeldung arbeiten
Wer KCForms aus einem eigenen Programm mit Benutzername und Passwort
anspricht (wie scripts\import-forms.ps1), holt sich nach der Anmeldung
das Token und schickt es bei jeder ändernden Anfrage mit:
GET /api/auth/csrfliefert{"headerName": "X-CSRF-TOKEN", "token": "…"}.- Den Wert im Header
X-CSRF-TOKENmitschicken.
Fehlt das Token oder ist es veraltet, antwortet KCForms mit 403 und
dem Header X-KC-Csrf: invalid; dann das Token neu holen.
Ohne Token kommen aus:
- die Anmeldung selbst (auch OIDC und BankID),
- REST-Services und der Transport-Empfang — sie haben eigene Tokens,
- der Setup-Assistent und der Paket-Import aus dem Designwerkzeug,
- die Demo-Gegenstellen (siehe unten).
Einbetten in andere Seiten¶
KCForms lässt sich nur von der eigenen Adresse in einen iframe einbetten. Wie du ein Portal zusätzlich erlaubst, steht unter Portal-Integration → Einbetten erlauben.
Content-Security-Policy¶
Die Content-Security-Policy legt fest, woher eine Seite Skripte, Bilder und Stile laden darf. Eingeschleuster Code von fremden Adressen oder in der Seite selbst wird damit unwirksam.
KCForms setzt die Policy durch. Vor der Umstellung haben wir jede Seite im Auslieferungsbetrieb (WAR auf Tomcat) unter der durchgesetzten Policy aufgerufen: alle Formulare, alle Bereiche der Administration, den Formular-Editor, den PDF-Druck und die Swagger-Seite der REST-Services. Dabei wurde nichts blockiert.
Blockiert der Browser trotzdem einmal etwas, meldet er es an KCForms. Im
Server-Protokoll steht das unter dem Namen kcforms.csp, je Art des Verstoßes
einmal:
WARN kcforms.csp : CSP-Verstoss (enforce, csp-report): Direktive=img-src blockiert=https://… Seite=https://…/?…
enforce heißt: Der Browser hat den Zugriff verhindert. Solche Zeilen gehören
in einen Fehlerbericht — sie zeigen, welche Funktion die Policy noch braucht.
Wenn eine eigene Anpassung an der Policy scheitert¶
Typische Ursachen sind eigene Theme- oder Admin-CSS-Regeln, die Schriften
oder Bilder von einer fremden Adresse laden (@import url(https://fonts…)),
oder Leittexte, die Bilder von fremden Servern einbinden. Die Policy erlaubt nur
Inhalte von der KCForms-Adresse selbst. Am besten legen Sie solche Dateien in
den Asset-Ordner von KCForms.
Als Notlösung lässt sich die Policy auf „nur melden" zurückstellen:
| Wert | Wirkung |
|---|---|
enforce (Vorgabe) |
Policy durchgesetzt, Verstöße werden gemeldet |
report-only |
nichts blockiert, Verstöße werden nur gemeldet |
off |
keine Policy (nur der Schutz gegen Einbetten bleibt) |
Ein unbekannter Wert gilt als enforce — ein Tippfehler schaltet den Schutz
nicht ab. Der Schutz gegen fremdes Einbetten (frame-ancestors) gilt in jeder
Einstellung.
Warum 'unsafe-eval' in der Policy steht
Bedingungen wie „sichtbar, wenn …", Client-Skripte und Validatoren werden im Browser ausgewertet. Dafür braucht KCForms die Auswertung von Ausdrücken zur Laufzeit. Eingeschleuste Skripte in der Seite und Skripte von fremden Adressen bleiben trotzdem gesperrt. Ein Sicherheitsscanner meldet diese Stelle als Warnung; sie ist bekannt und begründet.
Ausgenommen ist nur der Start der SAML-Anmeldung: Diese Seite schickt die Anmeldeanfrage mit einem kurzen Skript an die Hochschule und enthält keine Daten der Anwender.
Weitere Kopfzeilen¶
| Kopfzeile | Wirkung |
|---|---|
Content-Security-Policy |
siehe oben; enthält auch frame-ancestors — Einbetten nur von erlaubten Adressen |
Cross-Origin-Opener-Policy: same-origin |
Ein von einer fremden Seite geöffnetes KCForms-Fenster ist von ihr abgeschottet |
Referrer-Policy: strict-origin-when-cross-origin |
Ein Klick auf einen fremden Link verrät nicht die volle Adresse — wichtig, weil Web-Links ihren Schlüssel in der Adresse tragen |
Permissions-Policy |
Kamera, Mikrofon, Standort und Zahlungen sind abgeschaltet |
X-Content-Type-Options: nosniff |
Hochgeladene Dateien werden nicht als Seite ausgeführt |
Demo-Gegenstellen¶
Unter /api/demo/** liegen kleine Testdienste (Echo, Statuscodes, Upload-Echo,
SOAP-Testdienst), gegen die die Handbuch-Beispiele und die Demo-Formulare
„HTTP-Client" und „Webservice" ihre Skripte laufen lassen. Sie sind ohne
Anmeldung erreichbar und deshalb standardmäßig abgeschaltet.
Einschalten nur dort, wo die Beispiele laufen sollen:
Im lokalen Entwicklungs-Stack (docker\docker-compose.yml) ist der Schalter
an.