You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用发布Play Store遇WebViewClient.onReceivedSslError安全漏洞求助

解决Flutter webview_flutter的onReceivedSslError安全漏洞告警

我最近帮好几个开发者处理过Google Play的这个SSL错误处理告警,其实核心问题就是webview_flutter默认的SSL错误处理逻辑不符合Google的安全规范——如果你的代码里允许忽略SSL错误并继续加载页面,就会触发这个警告。下面是Flutter端的具体解决步骤:

第一步:升级webview_flutter到最新稳定版

首先确保你用的是最新版本的webview_flutter包,旧版本可能存在默认处理不严谨的问题。在pubspec.yaml里更新依赖:

dependencies:
  webview_flutter: ^4.4.0 # 替换为当前最新稳定版

然后执行flutter pub get完成升级。

第二步:正确实现onReceivedSslError回调

关键是在WebView的配置中,重写onReceivedSslError方法,绝对不能调用error.proceed()(这是触发告警的直接原因),而是调用error.cancel()终止不安全的连接,同时可以给用户友好提示。

针对webview_flutter 4.x+(使用WebViewController)

现在新版本推荐用WebViewWidget配合WebViewController,代码示例如下:

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class SafeWebView extends StatelessWidget {
  const SafeWebView({super.key});

  @override
  Widget build(BuildContext context) {
    final controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..loadRequest(Uri.parse('https://your-target-url.com'))
      // 核心:正确处理SSL错误
      ..setOnReceivedSslError((controller, error) async {
        // 终止不安全的请求
        error.cancel();
        // 给用户弹出提示
        if (context.mounted) {
          ScaffoldMessenger.of(context).showSnackBar(
            const SnackBar(
              content: Text('SSL证书验证失败,无法加载页面,请检查网络或联系管理员'),
              backgroundColor: Colors.red,
            ),
          );
        }
      });

    return WebViewWidget(controller: controller);
  }
}

针对webview_flutter 3.x及以下(旧版WebView组件)

如果你还在使用旧版的WebView组件,代码如下:

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class SafeWebView extends StatelessWidget {
  const SafeWebView({super.key});

  @override
  Widget build(BuildContext context) {
    return WebView(
      initialUrl: 'https://your-target-url.com',
      javascriptMode: JavaScriptMode.unrestricted,
      // 核心:正确处理SSL错误
      onReceivedSslError: (controller, error) {
        error.cancel();
        // 自定义提示逻辑
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(
            content: Text('SSL证书验证失败,无法加载页面'),
            backgroundColor: Colors.red,
          ),
        );
      },
    );
  }
}

为什么这样处理?

Google的安全规范要求:当WebView遇到SSL证书验证失败的情况时,必须拒绝加载不安全的内容,不能允许用户跳过验证继续访问。如果你的代码里调用了error.proceed(),就会被判定为“不安全的实现”,从而触发Play Store的告警。

按照上面的方式修改后,重新打包上传到Google Play,等待审核即可解除这个安全漏洞告警。

内容的提问来源于stack exchange,提问作者Raghu Mudem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:35:41