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

Flutter中如何防范半/全覆盖窗口下的Tapjacking(点击劫持)

Flutter 点击劫持(Tapjacking)防范方案

Android 端实现

你找到的原生代码确实能解决问题,具体使用位置和方式如下:

  • 打开项目的 android/app/src/main/kotlin/[你的包名]/MainActivity.kt 文件
  • 在 onCreate 方法内添加这段代码:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val view = findViewById<View>(android.R.id.content).rootView
    view.filterTouchesWhenObscured = true
}

这段代码的作用是:当应用窗口被其他窗口(半覆盖/全覆盖)遮挡时,直接过滤掉所有触摸事件,避免用户点击被劫持。

更简洁的方式是直接在 AndroidManifest.xml 里配置:

<activity
    android:name=".MainActivity"
    android:filterTouchesWhenObscured="true">
    <!-- 其他原有配置 -->
</activity>

这样无需修改 Kotlin 代码,就能开启相同的防护效果。

iOS 端实现

iOS 平台也有对应的原生防护手段,修改 ios/Runner/AppDelegate.swift 文件:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    
    // 开启窗口安全防护,防范点击劫持与内容泄露
    self.window?.isSecure = true
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

window.isSecure = true 会阻止应用窗口被其他应用截图、录屏,同时也能拦截遮挡窗口的触摸劫持行为。

Flutter 层辅助防护

除了原生层的核心防护,还可以在 Flutter 代码里做补充:

  • 用 WidgetsBindingObserver 监听应用生命周期,当应用从后台回到前台时,通过原生通道调用 Android 的 View.isObscured 方法,检测窗口是否被遮挡
  • 对支付、确认类敏感操作按钮,在检测到窗口被遮挡时暂时禁用,或添加二次确认步骤

注:Flutter 本身没有直接处理 Tapjacking 的 API,必须依赖原生平台的能力实现核心防护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:22:10