flawopen.com/XSS di Swift/loadHTMLString
Apakah WKWebView.loadHTMLString di iOS aman untuk konten tak tepercaya?
Tidak otomatis aman: WKWebView mem-parsing string yang diberikan sebagai HTML, sehingga tag dan markup yang dapat menjalankan skrip tetap aktif kecuali kontennya tepercaya atau ditangani sesuai konteks. Teks biasa dan HTML kaya buatan pengguna memerlukan kontrol yang berbeda.
Penggunaan aman
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)
Risiko tambahan yang perlu diperiksa
Penangan pesan di page world memberi skrip halaman jalur menuju kode aplikasi. `WKContentWorld` dapat memisahkan lingkungan JavaScript, tetapi skrip halaman dan aplikasi tetap berbagi DOM. Jika HTML tak tepercaya dan bridge digunakan bersama, buka hanya kemampuan minimum, validasi pesan beserta frame-nya, lalu otorisasi tiap operasi; jangan samakan pemisahan world dengan otorisasi.
Yang dikendalikan baseURL
Apple mendokumentasikan `baseURL` sebagai dasar untuk menyelesaikan URL relatif dalam HTML yang diberikan. Parameter ini tidak menyanitasi markup atau menonaktifkan JavaScript halaman. Nilai `nil` bukan perlindungan XSS atau pengaturan sandbox; atur kebijakan resource dan navigasi secara terpisah.
Pilih kontrol untuk setiap batas
Untuk teks biasa di dalam node teks HTML, gunakan encoder khusus konteks seperti contoh di bawah; jangan gunakan ulang untuk atribut, URL, CSS, atau JavaScript. Untuk HTML kaya buatan pengguna, gunakan sanitizer terpelihara dengan allowlist elemen, atribut, dan skema URL yang eksplisit. Kirim nilai ke JavaScript aplikasi melalui argumen `callAsyncJavaScript`, bukan interpolasi ke kode sumber. Jika halaman tidak memerlukan JavaScript, `allowsContentJavaScript` dapat menonaktifkan skrip halaman sebagai pertahanan tambahan; ini tidak menggantikan penanganan output yang benar.
Tanya jawab
Tidak. Risikonya sama dan tidak ada sanitasi tambahan bawaan. Migrasi ke WKWebView memodernisasi teknologi, tetapi tidak dengan sendirinya memperbaiki keamanan.
Tidak. Apple mendokumentasikan `baseURL` untuk menyelesaikan URL relatif. Ini bukan sanitizer HTML, sakelar skrip, atau jaminan sandbox.
Tidak. Lingkungan JavaScript dipisahkan, tetapi DOM dibagikan. Perlakukan data DOM dan pesan sebagai tidak tepercaya, lalu otorisasi setiap operasi native secara terpisah.
Referensi
- Apple Developer — WKWebView
- flawopen.com — XSS di Swift
- Apple — WKWebView.callAsyncJavaScript(_:arguments:in:in:completionHandler:)
- Apple — WKContentWorld
- Apple — WKUserContentController.add(_:contentWorld:name:)
- Apple — WKWebpagePreferences.allowsContentJavaScript
- OWASP — Pencegahan Cross Site Scripting
- Apple — WKWebView.loadHTMLString(_:baseURL:)