Swift 제한되지 않은 WebView HTML 로드

제한되지 않은 WebView HTML 로드

설명

WKWebView 또는 UIWebView에 신뢰할 수 없는 HTML을 로드하면 스크립트나 리소스 요청을 통해 데이터가 노출될 수 있습니다. baseURL은 상대 URL을 해석하는 기준이므로 nil이나 공격자가 정한 값에 의존하지 말고 명시적으로 설정하세요. 실제 로컬 파일 접근 가능 여부는 WebView 종류와 설정에 따라 달라집니다.

잠재적 영향

  • WebView 기반 크로스 사이트 스크립팅
  • 로컬 파일 또는 앱 데이터 접근 위험 증가
  • 공격자 제어 URL로 데이터 유출

해결 방법

  1. HTML 문자열을 로드할 때 baseURL을 about:blank 또는 앱이 제어하는 안전한 URL로 지정합니다.
  2. 사용자 제어 HTML은 로드 전에 신뢰 경계를 분리하고 필요한 경우 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 정책 제한도 적용해야 합니다.

참조