Zum Inhalt

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:

  1. GET /api/auth/csrf liefert {"headerName": "X-CSRF-TOKEN", "token": "…"}.
  2. Den Wert im Header X-CSRF-TOKEN mitschicken.

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:

KCFORMS_SECURITY_CSP=report-only
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:

KCFORMS_DEMO_ENDPOINTS=true

Im lokalen Entwicklungs-Stack (docker\docker-compose.yml) ist der Schalter an.

Siehe auch