在 HarmonyOS 的混合开发架构中,WebView 既是功能的增强器,也是安全防线的“薄弱环节”。由于它运行着来自网络的第三方代码,必须建立严密的隔离与授权机制。
1. WebView 常见安全风险
- JS 注入与 XSS 攻击:恶意脚本通过网页注入,尝试调用你通过
registerJavaScriptProxy暴露的原生接口,从而窃取用户信息、拨打电话或读取文件。 - 同源策略绕过(Cross-Site Scripting) :攻击者利用
file://协议的漏洞,读取应用私有目录下的数据库或首选项文件。 - 中间人攻击(MITM) :在不安全的 HTTP 环境下,页面内容被劫持并替换为钓鱼页面。
- 意图重定向(Intent Redirect) :通过特定的 Schema(如
intent://)拉起系统内其他无辜的应用执行危险操作。
2. 如何限制 JS 调用原生能力?
限制 JS 权限的核心原则是 “最小化暴露” 和 “显式授权” 。
A. 接口暴露控制
不要直接暴露整个对象,而是封装一个专门的桥接类(Bridge Class)。
-
API 10+ 增强:在 HarmonyOS 中,必须在 ArkTS 类的方法上使用
@Concurrent(如果涉及多线程)或确保方法是公开的。 -
白名单校验:在原生方法内部,始终校验当前 WebView 的 URL。
TypeScript
// 在 ArkTS 侧的方法内 foo(data: string) { const currentUrl = this.controller.getUrl(); if (!currentUrl.startsWith("https://trusted.com")) { return; // 拒绝非法域名的调用 } // 执行逻辑... }
B. 禁用不必要的功能
如果 H5 页面不需要某些能力,应在配置中果断关闭:
- 关闭 JS 执行:对于纯展示的静态页,
webStandard.jsEnabled(false)。 - 禁用访问本地文件:
webStandard.fileAccess(false)。 - 禁用存储能力:如
domStorageEnabled(false)。
3. 如何防止跨域攻击?
跨域攻击通常利用浏览器对不同来源(Origin)资源访问的限制漏洞。
A. 严格的同源策略配置
在 HarmonyOS Web 组件中,可以通过 databaseAccess 和 fileAccess 开关防止网页读取本地敏感数据。
- 禁止
file://跨域:确保不启用allowFileAccessFromFileURLs。这能防止下载到本地的恶意 HTML 文件读取手机里的其他文件。
B. 内容安全策略 (CSP)
这是最有效的防御手段。在 H5 页面的 HTTP Header 或 <meta> 标签中配置 CSP:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.js.com;- 作用:强制浏览器只加载来自本站或特定信任域的脚本,彻底封杀外链恶意脚本。
C. 资源拦截校验 (onInterceptRequest)
利用 ArkUI 提供的拦截能力,对所有发出的请求进行二次校验。
TypeScript
onInterceptRequest(event) {
const url = event.request.getRequestUrl();
if (url.startsWith("http://")) {
// 强制拦截非 HTTPS 请求,防止中间人攻击
return null;
}
}
4. 安全加固建议表
| 风险点 | 推荐配置 / 操作 |
|---|---|
| 混合内容风险 | 使用 WebMixedMode.None,禁止在 HTTPS 页面加载 HTTP 资源。 |
| JSBridge 滥用 | 仅对 https:// 且属于自家域名的 URL 启用 registerJavaScriptProxy。 |
| Cookie 泄露 | 为 Cookie 设置 HttpOnly 标志,防止 JS 脚本读取敏感 Token。 |
| 地理位置泄露 | 严格实现 onPermissionRequest 回调,由原生弹窗让用户手动确认。 |
总结
WebView 的安全不是单一配置决定的,而是由 “域名白名单 + 接口最小化 + HTTPS 强制 + 资源拦截” 构建的深度防御体系。