Swiftの制限のないWebViewのHTML読み込み

制限のないWebViewのHTML読み込み

説明

WKWebView や UIWebView に信頼できないHTMLを読み込むと、スクリプトやリソースのリクエストを通じてデータが漏えいするおそれがあります。baseURL は相対URLを解決する基準になるため、nil や攻撃者が指定した値に依存せず、明示的に設定してください。実際にローカルファイルへアクセスできるかどうかは、WebViewの種類や設定によって異なります。

想定される影響

  • WebView内でのクロスサイトスクリプティング
  • ローカルファイルやアプリのデータにアクセスされるリスクの増大
  • 攻撃者が制御するURLへのデータ流出

対処方法

  1. HTML文字列を読み込む際は、baseURL に about:blank またはアプリが管理する適切なURLを指定します。
  2. 信頼できないHTMLは信頼境界を分けて扱い、必要に応じてサニタイズや適切なテンプレートでのレンダリングを行います。
  3. ローカルファイルへのアクセスが必要な場合は、アクセス範囲を必要最小限にした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のポリシーによる制限も必要です。

参考資料