説明
WKWebView や UIWebView に信頼できないHTMLを読み込むと、スクリプトやリソースのリクエストを通じてデータが漏えいするおそれがあります。baseURL は相対URLを解決する基準になるため、nil や攻撃者が指定した値に依存せず、明示的に設定してください。実際にローカルファイルへアクセスできるかどうかは、WebViewの種類や設定によって異なります。
想定される影響
- WebView内でのクロスサイトスクリプティング
- ローカルファイルやアプリのデータにアクセスされるリスクの増大
- 攻撃者が制御するURLへのデータ流出
対処方法
- HTML文字列を読み込む際は、
baseURLにabout:blankまたはアプリが管理する適切なURLを指定します。 - 信頼できないHTMLは信頼境界を分けて扱い、必要に応じてサニタイズや適切なテンプレートでのレンダリングを行います。
- ローカルファイルへのアクセスが必要な場合は、アクセス範囲を必要最小限にしたWebKitのAPIを使います。
例
変更前
swift
webView.loadHTMLString(html, baseURL: nil)
変更後
swift
import WebKit
func loadTrustedContent(in webView: WKWebView) {
let trustedHTML = "<p>Content generated by the application</p>"
webView.loadHTMLString(
trustedHTML,
baseURL: URL(string: "about:blank"))
}
説明:
- 変更前: HTMLの信頼性を確認せず、相対URLの基準も明示していません。
nilだけでローカルファイルへのアクセス権が与えられるとは断定できません。 - 変更後: アプリが生成した信頼できるHTMLに、明示的なベースURLを指定します。
about:blankを指定しても、ユーザーが制御するHTMLのスクリプトや絶対URLは無害化されません。外部のHTMLには、適切なサニタイズとWebViewのポリシーによる制限も必要です。