跳转到内容

安全

WebView 会在应用内执行远程内容,应作为高风险集成点处理。

NavigationDelegate(
onNavigationRequest: (NavigationRequest request) {
final uri = Uri.tryParse(request.url);
if (uri == null) return NavigationDecision.prevent;
const allowedHosts = {'example.com', 'accounts.example.com'};
return allowedHosts.contains(uri.host)
? NavigationDecision.navigate
: NavigationDecision.prevent;
},
);

myapp:// 这类自定义 scheme,应交给应用路由处理并阻止 WebView 继续导航。

JavaScript channel 是页面到应用的桥。所有消息都要验证:

await controller.addJavaScriptChannel(
'AppBridge',
onMessageReceived: (JavaScriptMessage message) {
final decoded = jsonDecode(message.message);
if (decoded is! Map<String, Object?>) return;
if (decoded['type'] != 'expected-event') return;
},
);

不要直接向页面暴露 token、文件路径或高权限命令。

生产环境默认取消证书错误:

onSslAuthError: (SslAuthError error) async {
await error.cancel();
}

proceed() 只应在受控测试环境使用。

认证 cookie 优先由服务端设置 SecureHttpOnlySameSite。客户端 WebViewCookieManager 并不能在所有平台设置所有属性。Windows 虽有 WindowsWebViewCookie 扩展元数据,但服务端 cookie 仍是更稳妥的来源。

Android 上建议显式禁止 mixed content:

await (controller.platform as AndroidWebViewController)
.setMixedContentMode(MixedContentMode.neverAllow);

其他平台应优先只加载 HTTPS,并通过 onNavigationRequest 限制未知 host。

不需要时关闭 file access:

await (controller.platform as AndroidWebViewController)
.setAllowFileAccess(false);
await (controller.platform as OhosWebViewController)
.setAllowFileAccess(false);

Linux 上不要对不可信本地文件启用 setAllowUniversalAccessFromFileUrls(true)

Web 平台应谨慎配置 iframe sandbox:

final params = WebWebViewControllerCreationParams(
iFrameSandbox: 'allow-same-origin allow-scripts allow-forms',
iFrameReferrerPolicy: 'no-referrer',
);

除非产品明确需要,不要随意添加 allow-top-navigation 等高权限 sandbox 能力。