설명
WKWebView.evaluateJavaScript에 문자열 결합 또는 보간으로 만든 스크립트를 전달하면 외부 입력이 JavaScript 코드로 실행되어 WebView 컨텍스트에서 코드 삽입이 발생할 수 있습니다.
잠재적 영향
- WebView JavaScript 코드 삽입
- 로컬 데이터 탈취
- 사용자 세션 또는 화면 조작
해결 방법
evaluateJavaScript에는 정적인 스크립트만 전달합니다.- 외부 데이터는
callAsyncJavaScript의arguments딕셔너리처럼 코드와 데이터를 분리하는 API로 전달합니다. - 사용자 입력을 JavaScript 소스 문자열에 결합하거나 보간하지 않습니다.
예시
변경 전
swift
webView.evaluateJavaScript("console.log(" + remoteData + ")")
변경 후
swift
try await webView.callAsyncJavaScript(
"console.log(data)",
arguments: ["data": remoteData],
contentWorld: .page
)
설명:
- 변경 전: 외부 데이터를 JavaScript 코드 문자열에 결합해 실행합니다.
- 변경 후: 코드와 데이터를 분리해 전달합니다.