WebView与iOS应用通过evaluateJavaScript通信是否存在安全风险?
使用WKWebView的evaluateJavaScript做原生交互的安全性问题
问题描述
我在iOS应用中用WebView展示部分视图,需要实现WebView与原生平台的交互响应功能。iOS同事提供了基于evaluateJavaScript的POC方案,核心方法定义如下:
func evaluateJavaScript( _ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil )
这个方案的思路是给DOM元素添加ID,通过注入脚本到DOM中执行来实现交互。但我听到“脚本注入”后对安全性产生了顾虑,想咨询:这个方案是否安全?会不会被黑客利用注入恶意脚本?
安全性分析与结论
1. API本身安全,风险源于使用方式
evaluateJavaScript是苹果官方提供的合法API,本身不存在安全漏洞。是否会被利用注入恶意脚本,完全取决于你注入的脚本内容是否可控:
- 如果注入的JS代码是完全可信的(比如硬编码的固定逻辑、从可信后端获取且经过严格校验的代码),那么不存在安全风险。
- 如果脚本内容包含未校验的不可信输入(比如用户输入、第三方数据源),且直接拼接成JS代码注入,就会触发类似XSS的注入风险——黑客可以构造恶意代码窃取WebView内的敏感数据,甚至通过JS桥调用原生功能执行恶意操作。
2. 针对DOM元素加ID的场景
你们的方案中,只要满足以下条件就是安全的:
- 所有操作的DOM元素ID是前端与原生约定好的可控值,无用户可控的动态ID。
- 注入的脚本是固定模板,仅使用可信的ID参数,没有拼接任何不可信字符串。
举个安全的示例:
// 固定脚本模板,仅替换可信的ID参数 let trustedElementId = "user-profile-btn" // 前端预先定义的ID,无用户输入 let jsScript = "document.getElementById('\(trustedElementId)').addEventListener('click', function() { window.webkit.messageHandlers.nativeBridge.postMessage('btn-click') });" webView.evaluateJavaScript(jsScript, completionHandler: nil)
3. 风险规避建议
- 禁止直接拼接不可信输入到JS代码:如果必须使用动态内容,要对输入做严格的转义处理(比如转义单引号、双引号、反斜杠等特殊字符)后再嵌入脚本。
- 优先使用WKScriptMessageHandler:苹果更推荐用
WKScriptMessageHandler实现WebView与原生的双向交互——前端通过window.webkit.messageHandlers.xxx.postMessage()主动发送消息给原生,无需原生注入脚本,安全性更高。 - 限制WebView权限:配置WKWebView的
configuration,禁用不必要的权限(比如禁止JS自动执行、限制跨域请求等),即使出现风险也能降低危害范围。
内容的提问来源于stack exchange,提问作者user24136
相关产品推荐
相关产品推荐

