flawopen.com/Swift में XSS/loadHTMLString
क्या iOS का WKWebView.loadHTMLString अविश्वसनीय सामग्री के लिए सुरक्षित है?
अपने आप सुरक्षित नहीं होता: WKWebView दी गई string को HTML की तरह parse करता है, इसलिए tags और script चलाने वाली markup तब तक सक्रिय रहती है जब तक सामग्री भरोसेमंद न हो या सही context के लिए संभाली न गई हो। साधारण text और user-authored rich HTML के लिए अलग नियंत्रण चाहिए।
सुरक्षित उपयोग
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)
जाँचने योग्य अतिरिक्त जोखिम
Page-world message handler पेज स्क्रिप्ट को ऐप कोड तक रास्ता देता है। `WKContentWorld` JavaScript environments को अलग कर सकता है, लेकिन पेज और ऐप स्क्रिप्ट DOM साझा करते हैं। यदि untrusted HTML और bridge साथ हों, तो केवल न्यूनतम क्षमता expose करें, message और उसके frame को validate करें और हर operation को authorize करें; world separation को authorization न समझें।
baseURL क्या नियंत्रित करता है
Apple `baseURL` को दिए गए HTML में relative URL resolve करने के आधार के रूप में बताता है। यह markup को sanitize नहीं करता और पेज का JavaScript बंद नहीं करता। `nil` XSS या sandbox सुरक्षा नहीं है; resource और navigation नीति अलग से तय करें।
हर boundary के लिए सही नियंत्रण चुनें
HTML text node में साधारण text डालते समय उसी context के लिए encoder इस्तेमाल करें, जैसे नीचे दिया गया है; इसे attributes, URLs, CSS या JavaScript में दोबारा इस्तेमाल न करें। उपयोगकर्ता-लिखित rich HTML के लिए maintained sanitizer लें और elements, attributes तथा URL schemes की स्पष्ट allowlist रखें। App JavaScript को values `callAsyncJavaScript` arguments से दें, source में interpolate न करें। `WKContentWorld` JavaScript environments अलग करता है, लेकिन DOM साझा रहता है; इससे native actions की अनुमति नहीं मिलती। Bridge को सीमित रखें और हर message तथा operation validate करें। यदि पेज को JavaScript की जरूरत न हो, तो `allowsContentJavaScript` अतिरिक्त सुरक्षा के रूप में page scripts बंद कर सकता है; यह सही output handling का विकल्प नहीं है।
अक्सर पूछे जाने वाले प्रश्न
नहीं। उसमें भी यही जोखिम है और कोई अतिरिक्त अंतर्निहित सैनिटाइज़ेशन नहीं है। WKWebView पर जाना तकनीक को आधुनिक बनाता है, लेकिन अपने आप सुरक्षा समस्या हल नहीं करता।
नहीं। Apple `baseURL` को relative URL resolve करने के लिए बताता है। यह HTML sanitizer, script switch या sandbox की गारंटी नहीं है।
नहीं। यह JavaScript environments अलग करता है, लेकिन वे DOM साझा करते हैं। DOM data और messages को अविश्वसनीय मानें और हर native operation को अलग से authorize करें।
संदर्भ
- Apple Developer — WKWebView
- flawopen.com — Swift में XSS
- Apple — WKWebView.callAsyncJavaScript(_:arguments:in:in:completionHandler:)
- Apple — WKContentWorld
- Apple — WKUserContentController.add(_:contentWorld:name:)
- Apple — WKWebpagePreferences.allowsContentJavaScript
- OWASP — Cross Site Scripting से बचाव
- Apple — WKWebView.loadHTMLString(_:baseURL:)