HTML-Bereinigung

Das Modul html bereinigt nicht vertrauenswürdiges HTML anhand von Richtlinien, die auf bluemonday beruhen.

Die Bereinigung parst ein HTML-Fragment und filtert es anhand einer Allowlist. Nicht erlaubte Elemente und Attribute werden entfernt; das verbleibende Fragment wird bei der Serialisierung normalisiert.

Diese Seite ist eine API-Referenz. Konstruktorblöcke sind eigenständige Richtlinienbeispiele; spätere Methodenblöcke sind partielle Konfigurationsausschnitte, die ein bereits erzeugtes policy voraussetzen. Die bereinigte Ausgabe eignet sich nur als Inhalt eines HTML-Elements. Für die Interpolation in JavaScript, CSS, URLs oder HTML-Attribute ist sie nicht sicher; verwenden Sie einen Encoder für den tatsächlichen Ausgabekontext.

Laden

local html = require("html")

Vordefinierte Richtlinien

Drei eingebaute Richtlinien für häufige Anwendungsfälle:

Richtlinie Anwendungsfall Erlaubt
new_policy Benutzerdefinierte Bereinigung Nichts (von Grund auf aufbauen)
ugc_policy Benutzerkommentare, Foren Gängige Formatierung (p, b, i, a, Listen, etc.)
strict_policy Reintext-Extraktion Nichts (entfernt alles HTML)

Alle drei Konstruktoren liefern Policy, nil; die Richtlinienerzeugung schlägt derzeit nicht fehl.

Leere Richtlinie

Erstellt eine Richtlinie, die nichts erlaubt. Verwenden Sie dies, um eine benutzerdefinierte Whitelist von Grund auf aufzubauen.

local policy, err = html.sanitize.new_policy()
if err then return nil, err end

policy:allow_elements("p", "strong", "em")
policy:allow_attrs("class"):globally()

local clean = policy:sanitize(user_input)

Gibt zurück: Policy, error

Benutzerinhalt-Richtlinie

Vorkonfiguriert für benutzergenerierten Inhalt. Erlaubt gängige Formatierungselemente.

local policy, err = html.sanitize.ugc_policy()
if err then return nil, err end

local safe = policy:sanitize('<p>Hello <strong>world</strong></p>')
-- '<p>Hello <strong>world</strong></p>'

local xss = policy:sanitize('<p>Hello <script>alert("xss")</script></p>')
-- '<p>Hello </p>'

Gibt zurück: Policy, error

Strikte Richtlinie

Entfernt alles HTML, gibt nur Reintext zurück.

local policy, err = html.sanitize.strict_policy()
if err then return nil, err end

local text = policy:sanitize('<p>Hello <b>world</b>!</p>')
-- 'Hello world!'

Gibt zurück: Policy, error

Element-Kontrolle

Elemente erlauben

Bestimmte HTML-Elemente auf Whitelist setzen.

local policy, err = html.sanitize.new_policy()
if err then return nil, err end
policy:allow_elements("p", "strong", "em", "br")
policy:allow_elements("h1", "h2", "h3")
policy:allow_elements("a", "img")

local result = policy:sanitize('<p>Hello <strong>world</strong></p>')
-- '<p>Hello <strong>world</strong></p>'
Parameter Typ Beschreibung
... string Element-Tag-Namen

Gibt zurück: Policy

Attribut-Kontrolle

Attribute erlauben

Attribut-Berechtigung starten. Mit on_elements() oder globally() verketten.

policy:allow_attrs("href"):on_elements("a")
policy:allow_attrs("src", "alt"):on_elements("img")
policy:allow_attrs("class", "id"):globally()
Parameter Typ Beschreibung
... string Attributnamen

Gibt zurück: AttrBuilder

Auf bestimmten Elementen

Attribute nur auf bestimmten Elementen erlauben.

policy:allow_elements("a", "img")
policy:allow_attrs("href", "target"):on_elements("a")
policy:allow_attrs("src", "alt", "width", "height"):on_elements("img")
Parameter Typ Beschreibung
... string Element-Tag-Namen

Gibt zurück: Policy

Auf allen Elementen

Attribute global auf jedem erlaubten Element erlauben.

policy:allow_attrs("class"):globally()
policy:allow_attrs("id"):globally()

Gibt zurück: Policy

Mit Musterabgleich

Attributwerte gegen Regex-Muster validieren.

-- Only allow hex colors in style
local builder, err = policy:allow_attrs("style"):matching("^color:#[0-9a-fA-F]{6}$")
if err then
    return nil, err
end
builder:on_elements("span")

policy:sanitize('<span style="color:#ff0000">Red</span>')
-- '<span style="color:#ff0000">Red</span>'

policy:sanitize('<span style="background:red">Bad</span>')
-- '<span>Bad</span>'
Parameter Typ Beschreibung
pattern string Mit Go RE2 kompatibler regulärer Ausdruck

Gibt zurück: AttrBuilder, error

URL-Sicherheit

Standard-URLs

Aktiviert die Standardrichtlinie für URLs. Sie verlangt parsebare URLs, erlaubt relative URLs sowie mailto, http und https und ergänzt erlaubte Linkelemente um rel="nofollow".

policy:allow_elements("a")
policy:allow_attrs("href"):on_elements("a")
policy:allow_standard_urls()

Gibt zurück: Policy

URL-Schemata

Einschränken, welche URL-Schemata erlaubt sind.

policy:allow_url_schemes("https", "mailto")

policy:sanitize('<a href="https://example.com">OK</a>')
-- '<a href="https://example.com">OK</a>'

policy:sanitize('<a href="javascript:alert(1)">XSS</a>')
-- '<a>XSS</a>'
Parameter Typ Beschreibung
... string Erlaubte Schemata

Gibt zurück: Policy

Relative URLs

Relative URLs erlauben oder verbieten.

policy:allow_relative_urls(true)

policy:sanitize('<a href="/page">Link</a>')
-- '<a href="/page">Link</a>'
Parameter Typ Beschreibung
allow boolean Relative URLs erlauben

Gibt zurück: Policy

Parsbare URLs erfordern

URLs ablehnen, die nicht sauber geparst werden können. Mit true werden Attribut-URLs, die der HTML-Sanitizer nicht parsen kann, entfernt anstatt durchgereicht.

policy:require_parseable_urls(true)
Parameter Typ Beschreibung
require boolean URLs müssen parsbar sein

Gibt zurück: Policy

rel="nofollow" zu allen Links hinzufügen. Verhindert SEO-Spam.

policy:allow_attrs("href", "rel"):on_elements("a")
policy:allow_url_schemes("https")
policy:require_parseable_urls(true)
policy:require_nofollow_on_links(true)

policy:sanitize('<a href="https://example.com">Link</a>')
-- '<a href="https://example.com" rel="nofollow">Link</a>'
Parameter Typ Beschreibung
require boolean Nofollow hinzufügen

Gibt zurück: Policy

rel="noreferrer" zu allen Links hinzufügen. Verhindert Referrer-Lecks.

policy:require_noreferrer_on_links(true)
Parameter Typ Beschreibung
require boolean Noreferrer hinzufügen

Gibt zurück: Policy

target="_blank" zu vollqualifizierten URLs hinzufügen.

policy:allow_attrs("href", "target"):on_elements("a")
policy:allow_url_schemes("https")
policy:require_parseable_urls(true)
policy:add_target_blank_to_fully_qualified_links(true)

policy:sanitize('<a href="https://example.com">Link</a>')
-- '<a href="https://example.com" target="_blank" rel="noopener">Link</a>'
Parameter Typ Beschreibung
add boolean Target blank hinzufügen

Gibt zurück: Policy

Wenn nicht vertrauenswürdige Links in einem neuen Tab geöffnet werden, aktivieren Sie zusätzlich require_noreferrer_on_links(true), um Referrer-Leaks und den Zugriff über opener zu mindern.

Komfortmethoden

Bilder erlauben

Erlaubt <img> mit align, alt, height, width und src. Der Helper aktiviert außerdem die Standard-URL-Richtlinie, erlaubt aber keine Data-URI-Bilder.

policy:allow_images()

policy:sanitize('<img src="photo.jpg" alt="Photo">')
-- '<img src="photo.jpg" alt="Photo">'

Gibt zurück: Policy

Data-URI-Bilder erlauben

Erlaubt syntaktisch gültige Base64-kodierte Data-URI-Bilder der Typen gif, jpeg, png, svg+xml oder webp. Der Sanitizer prüft Medientyp und Base64-Kodierung, nicht den dekodierten Bildinhalt. Data-URIs können aktiven Inhalt transportieren; erlauben Sie sie nur, wenn Sie den Bilddaten vertrauen.

policy:allow_elements("img")
policy:allow_attrs("src"):on_elements("img")
policy:allow_data_uri_images()

local input = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Wl2O9sAAAAASUVORK5CYII=">'
policy:sanitize(input)
-- The data URI is preserved.

Gibt zurück: Policy

Listen erlauben

Erlaubt ul, ol, li, dl, dt und dd. Der Helper erlaubt außerdem validierte Attribute type auf ul, ol und li sowie ein ganzzahliges Attribut value auf li.

policy:allow_lists()

policy:sanitize('<ul><li>Item 1</li><li>Item 2</li></ul>')
-- '<ul><li>Item 1</li><li>Item 2</li></ul>'

Gibt zurück: Policy

Tabellen erlauben

Tabellenelemente erlauben: table, caption, col, colgroup, thead, tbody, tfoot, tr, td, th.

policy:allow_tables()

policy:sanitize('<table><tr><td>Cell</td></tr></table>')
-- '<table><tr><td>Cell</td></tr></table>'

Gibt zurück: Policy

Standardattribute erlauben

Gängige Attribute erlauben: id, title, dir, lang.

policy:allow_elements("p")
policy:allow_standard_attributes()

policy:sanitize('<p id="intro" class="text" title="Introduction">Hello</p>')
-- '<p id="intro" title="Introduction">Hello</p>'

Gibt zurück: Policy

Bereinigen

Richtlinie auf HTML-String anwenden.

local policy, err = html.sanitize.ugc_policy()
if err then return nil, err end
policy:require_nofollow_on_links(true)

local dirty = '<p>Hello</p><script>alert("xss")</script>'
local clean = policy:sanitize(dirty)
-- '<p>Hello</p>'
Parameter Typ Beschreibung
html string Zu bereinigendes HTML

Gibt zurück: string

sanitize liefert ausschließlich eine Zeichenkette. In Runtime v0.3.32a kann der zugrunde liegende Fragmentparser fehlerhafte, nicht parsebare Eingaben in eine leere Zeichenkette umwandeln; der Lua-Wrapper kann dies nicht von gültiger Eingabe unterscheiden, deren Inhalt die Richtlinie vollständig entfernt hat. Behandeln Sie die Bereinigung als Ausgabefilter, nicht als Eingabevalidierung. Prüfen Sie erforderlichen Inhalt separat, wenn ein leeres Ergebnis relevant ist.

Fehler

Bedingung Art Wiederholbar
Ungültiges Regex-Muster errors.INVALID nein

Siehe Fehlerbehandlung für die Arbeit mit Fehlern. Fügen Sie html zur Liste modules: des ausführbaren Eintrags hinzu, bevor Sie es per require laden.