7-7.【WebView】WebView 常见安全风险有哪些?如何限制 JS 调用原生能力?如何防止跨域攻击?

3 阅读3分钟

在 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 组件中,可以通过 databaseAccessfileAccess 开关防止网页读取本地敏感数据。

  • 禁止 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 强制 + 资源拦截” 构建的深度防御体系。