flawopen.com/XSS in Swift/loadHTMLString
Ist WKWebView.loadHTMLString unter iOS für nicht vertrauenswürdige Inhalte sicher?
Nicht automatisch: WKWebView interpretiert den übergebenen String als HTML. Tags und skriptfähiges Markup bleiben aktiv, bis der Inhalt vertrauenswürdig ist oder kontextgerecht behandelt wird. Klartext und nutzergeliefertes Rich-HTML erfordern unterschiedliche Schutzmaßnahmen.
Sichere Verwendung
let html = "\(untrustedText)
" webView.loadHTMLString(html, baseURL: nil)
func escapeHTMLText(_ value: String) -> String {
value
.replacingOccurrences(of: "&", with: "&")
.replacingOccurrences(of: "<", with: "<")
.replacingOccurrences(of: ">", with: ">")
.replacingOccurrences(of: "\"", with: """)
.replacingOccurrences(of: "'", with: "'")
}
let html = "\(escapeHTMLText(untrustedText))
"
webView.loadHTMLString(html, baseURL: nil)
Zusätzliches Risiko prüfen
Ein Nachrichtenhandler in der Seitenwelt eröffnet Seitenskripten einen Weg in den App-Code. `WKContentWorld` kann JavaScript-Umgebungen trennen, doch Seiten- und App-Skripte teilen weiterhin das DOM. Wenn nicht vertrauenswürdiges HTML und eine Bridge zusammenkommen, lege nur die unbedingt nötige Fähigkeit offen, prüfe Nachricht und Frame und autorisiere jeden Vorgang; verwechsle getrennte Welten nicht mit Autorisierung.
Was baseURL steuert
Apple beschreibt `baseURL` als Basis zum Auflösen relativer URLs im übergebenen HTML. Der Parameter bereinigt kein Markup und deaktiviert kein JavaScript der Seite. `nil` ist weder XSS-Schutz noch Sandbox-Einstellung; lege Ressourcen- und Navigationsregeln getrennt fest.
Für jede Grenze den passenden Schutz wählen
Für Klartext in einem HTML-Textknoten verwende einen Encoder für genau diesen Kontext, wie unten; nutze ihn nicht für Attribute, URLs, CSS oder JavaScript wieder. Für nutzergeliefertes Rich-HTML verwende einen gepflegten Sanitizer mit expliziten Positivlisten für Elemente, Attribute und URL-Schemata. Übergebe Werte mit `callAsyncJavaScript`-Argumenten an App-JavaScript, statt sie in Quelltext einzusetzen. Falls die Seite kein JavaScript braucht, kann `allowsContentJavaScript` Seitenskripte als zusätzliche Schutzschicht deaktivieren; korrekte Ausgabebehandlung ersetzt das nicht.
FAQ
Nein: Es birgt dasselbe Risiko und bietet ebenfalls keine zusätzliche Bereinigung. Der Wechsel zu WKWebView modernisiert die Technik, behebt aber nicht automatisch das Sicherheitsproblem.
Nein. Apple dokumentiert `baseURL` zum Auflösen relativer URLs. Es ist kein HTML-Sanitizer, Skriptschalter oder Sandbox-Versprechen.
Nein. Es trennt JavaScript-Umgebungen, die sich aber das DOM teilen. Behandle DOM-Daten und Nachrichten als nicht vertrauenswürdig und autorisiere jede native Aktion separat.
Quellen
- Apple Developer — WKWebView
- flawopen.com — XSS in Swift
- Apple — WKWebView.callAsyncJavaScript(_:arguments:in:in:completionHandler:)
- Apple — WKContentWorld
- Apple — WKUserContentController.add(_:contentWorld:name:)
- Apple — WKWebpagePreferences.allowsContentJavaScript
- OWASP — Cross-Site-Scripting-Prävention
- Apple — WKWebView.loadHTMLString(_:baseURL:)