Einleitung
Da die HTML-Bereinigung von Eingaben der Nutzenden von Administratoren unbeabsichtigt ausgeschaltet und ausgeschaltet gelassen werden kann oder schädlicher Text über die LMS-API in der Datenbank gespeichert werden kann, gibt es eine zusätzliche Schicht, die unsicheren Text automatisch bereinigt, bevor er in der Datenbank gespeichert wird. Das schützt das System und seine Nutzenden vor Cross-Site-Scripting-Angriffen (XSS), bei denen in Inhalten versteckte schädliche Skripte im Browser der Lesenden ausgeführt werden.
Die Bereinigung behält sichere Formatierungen wie Überschriften, Absätze, Listen, Links, Bilder und Tabellen bei. Sie entfernt alles, was Code ausführen könnte, etwa Skripte und eingebettete Frames. Deshalb kann gespeicherter Inhalt gelegentlich leicht anders aussehen als der eingegebene.
Funktionsweise
Inhalte werden im letzten Schritt vor dem Speichern in der Datenbank bereinigt, unabhängig davon, auf welchem Weg sie eintreffen. Das gilt gleichermaßen für Inhalte, die in der Benutzeroberfläche eingegeben, über die REST-API gesendet, über Nachrichtenwarteschlangen geliefert oder in Batch-Importen geladen werden.
Die Bereinigung basiert auf OWASP AntiSamy, einer etablierten Open-Source-Sicherheitsbibliothek. Sie gleicht das HTML mit einer Liste zulässiger Tags und Attribute ab. Alles, was nicht auf der Liste steht, wird entfernt, während Text und sichere Formatierungen erhalten bleiben.
Das wirkt als zusätzliche Schutzschicht. Selbst wenn unsicherer Inhalt andere Prüfungen passiert, erreicht er nie die gespeicherten Daten.
Was mit Text passiert, der HTML enthält
Jedes HTML-Tag wird auf eine von vier Arten behandelt. Die folgende Referenz zeigt, welche Behandlung für welches Tag gilt.
|
Verhalten |
Was passiert |
Beispieleingabe |
Gespeichertes Ergebnis |
|---|---|---|---|
|
Beibehalten |
Das Tag und sein Inhalt bleiben erhalten. Attribute, die nicht auf der Liste zulässiger Attribute stehen, werden entfernt. |
|
|
|
Geleert |
Das Tag bleibt erhalten, aber alles darin wird entfernt. |
|
|
|
Entfernt |
Das Tag und alles darin werden vollständig entfernt. |
|
(nichts) |
Links bleiben nur erhalten, wenn sie das Protokoll http oder https verwenden. Links mit anderen Protokollen, etwa javascript:, werden entfernt.
Referenz der unterstützten HTML-Tags
Die folgenden Attribute sind bei jedem unterstützten Tag zulässig: id, style, title, class, align und lang. Die Tabelle nennt zusätzliche Attribute, die ein Tag akzeptiert.
|
Kategorie |
Tag |
Verhalten |
Zusätzliche Attribute |
|---|---|---|---|
|
Überschriften |
|
Beibehalten |
— |
|
Textblöcke |
|
Beibehalten |
align |
|
Textblöcke |
|
Beibehalten |
align |
|
Textblöcke |
|
Beibehalten |
id, style, class |
|
Textblöcke |
|
Beibehalten |
— |
|
Textblöcke |
|
Beibehalten |
— |
|
Textformatierung |
|
Beibehalten |
— |
|
Textformatierung |
|
Beibehalten |
— |
|
Textformatierung |
|
Beibehalten |
— |
|
Textformatierung |
|
Beibehalten |
color, face, size |
|
Änderungen |
|
Beibehalten |
cite, datetime |
|
Links |
|
Beibehalten |
href, wref, onFocus, onBlur, target, nohref, rel, name |
|
Bilder |
|
Beibehalten |
src, name, alt, height, width, border, align, hspace, vspace |
|
Bilder |
|
Beibehalten |
— |
|
Listen |
|
Beibehalten |
— |
|
Listen |
|
Beibehalten |
type |
|
Listen |
|
Geleert |
— |
|
Tabellen |
|
Beibehalten |
height, width, border, bgcolor, cellpadding, cellspacing, background, align, noresize |
|
Tabellen |
|
Beibehalten |
align, char, charoff, valign |
|
Tabellen |
|
Beibehalten |
height, width, align, valign, char, charoff, background |
|
Tabellen |
|
Beibehalten |
abbr, axis, headers, scope, nowrap, bgcolor, height, width, align, char, charoff, valign, colspan, rowspan |
|
Tabellen |
|
Beibehalten |
background, bgcolor, abbr, axis, headers, scope, nowrap, height, width, align, char, charoff, valign, colspan, rowspan |
|
Tabellen |
|
Beibehalten |
span, width, align, char, charoff, valign |
|
Tabellen |
|
Beibehalten |
span, width, align, char, charoff, valign |
|
Tabellen |
|
Beibehalten |
— |
|
Formulare |
|
Beibehalten |
— |
|
Formulare |
|
Beibehalten |
for |
|
Gestaltung |
|
Beibehalten |
type, media |
|
Gestaltung |
|
Beibehalten |
media, type, rel |
|
Sonstiges |
|
Beibehalten |
— |
Entfernte Elemente
Die folgenden Elemente werden immer vollständig entfernt, einschließlich ihres gesamten Inhalts:
-
<script> -
<iframe> -
<frameset>und<frame>
Ereignisattribute wie onload und onerror werden ebenfalls entfernt, ebenso Stilangaben, die das Layout der umgebenden Seite verändern könnten.
Konfiguration
Die Bereinigung ist standardmäßig eingeschaltet. Sie wird über eine einzige Einstellung in der Datei ils/application.properties gesteuert:
ils.database.sanitize=true
Um die Bereinigung auszuschalten, ist der Wert auf false zu setzen und die Anwendung neu zu starten. Diese Einstellung ist derzeit die einzige Möglichkeit, dieses Verhalten zu ändern.
Das Ausschalten der Bereinigung entfernt einen wichtigen Schutz vor XSS-Angriffen. Dies sollte nur geschehen, wenn die Inhalte vollständig vertrauenswürdig sind oder vor dem Speichern von einem anderen System bereinigt werden.
Tipps und FAQ
Warum sieht gespeicherter Inhalt anders aus als der eingegebene? Ein verwendetes Tag oder Attribut steht nicht auf der Liste zulässiger Tags und Attribute und wurde entfernt. Die Referenztabelle oben zeigt die unterstützten Tags; stattdessen ist eine unterstützte Alternative zu verwenden.
Warum hat eine Definitionsliste ihren Text verloren? <dl>, <dt> und <dd> bleiben erhalten, werden aber geleert. Stattdessen kann eine <ul>-Liste oder eine <table> mit zwei Spalten verwendet werden.
Warum wurde ein Link entfernt? Nur http- und https-Links bleiben erhalten. Jeder Link muss mit einem dieser Protokolle beginnen.
Lassen sich Videos oder andere Seiten einbetten? Nein. <iframe> und Frame-Tags werden immer entfernt. Stattdessen ist mit <a> auf den Inhalt zu verlinken.
Gilt das auch für Inhalte, die über die API importiert werden? Ja. Alle Inhalte werden vor dem Speichern bereinigt, unabhängig von ihrer Quelle.