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
相关产品推荐
相关产品推荐

