Flutter 安全:为什么 `isMockLocation` 在 2026 年已失效(以及如何修复)

发布: (2026年2月5日 GMT+8 03:09)
4 min read
原文: Dev.to

Source: Dev.to

Flutter 安全:为何 isMockLocation 在 2026 年已失效(以及如何修复)

如果你正在使用 Flutter 构建物流、共享出行或现场考勤应用,你很可能已经写过下面这行代码:

if (location.isMock) {
  // Block user
}

五年前,这已经足够。在 2026 年,这已经是安全表演。
如果你的业务依赖于精准的位置信息(如配送跟踪、打卡系统),仅仅依赖 isMockLocation 正在让你亏本。

问题:猫捉老鼠游戏

Standard location packages in Flutter usually check the android.location.Location.isFromMockProvider() flag. Modern spoofing tools have evolved, and users today can:

  • Rooted Devices with Magisk: Modules that hide the root status from the OS。
  • Smali Patcher: Tools that patch the Android framework to always return false for mock location checks。
  • Advanced Emulators: BlueStacks or custom Android builds that simulate physical GPS hardware signals。

In these scenarios, your app asks the OS: “Is this fake?”
The compromised OS replies: “No, trust me.”
Your backend then accepts fraudulent data。

解决方案:不要信任设备

您不能依赖设备自行验证。请使用更高层级的权威,例如 Google Play Integrity API(前称 SafetyNet)。

挑战‑响应流程

  1. 挑战: 您的后端发送一个唯一的随机字符串(nonce)。
  2. 证明: 您的 Flutter 应用将此 nonce 转发给 Google 的 Play Integrity API。
  3. 令牌: Google 分析设备的二进制文件、引导加载程序和 GPS 硬件,并返回加密令牌。
  4. 判定: 您的应用将令牌发送到后端,后端使用 Google 的公钥解密以验证:
    • 应用二进制文件未被修改。
    • 设备为实体设备而非模拟器。
    • 位置很可能是真实的。

实现的痛点

  • 设置 Google Cloud 项目。
  • 处理 Android(Play Integrity)和 iOS(DeviceCheck)的平台通道。
  • 在后端(Node、Go、Python)管理令牌解密。
  • 处理超时和重试逻辑。

“Easy Button”:介绍 Geo‑Engine

为了简化集成,我创建了 Geo‑Engine,一个可复用的 Flutter SDK,能够原生处理完整性握手。它会在允许位置追踪开始之前,先验证 设备本身的完整性

代码示例

import 'package:geo_engine/geo_engine.dart';
import 'package:flutter/widgets.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 1. Initialize the local buffer (Hive)
  await GeoEngine.initialize();

  runApp(MyApp());
}

// ... inside your service or controller ...

class LocationService {
  late GeoEngine _engine;

  void init() {
    // 2. Configure the Engine with your credentials
    _engine = GeoEngine(
      apiKey: "YOUR_PROJECT_API_KEY",
      // Crucial: Enables Google Play Integrity on Android
      androidCloudProjectNumber: "1234567890",
      debug: true,
    );
  }

  // 3. When you get a location update (e.g. from geolocator)
  Future onLocationUpdate(double lat, double lng) async {
    // 4. Send it securely.
    // The SDK automatically handles:
    // - Offline buffering (if network is lost)
    // - Attaching the Integrity Token (X-Device-Integrity header)
    // - Batching updates to save battery
    await _engine.sendLocation(
      deviceId: "user_123",
      latitude: lat,
      longitude: lng,
    );
  }
}

Geo‑Engine 与现有的位置提供者(geolocatorlocation 等)协同工作,充当安全的“中间件”,在离线时缓冲数据,自动生成完整性令牌,并仅在设备通过验证后才将数据刷新到服务器。

结论

如果您的应用基于位置处理支付或其他敏感操作,依赖客户端标志如 isMockLocation 是一种漏洞。转向 服务器端完整性验证 已成为 2026 年的行业标准。无论您是手动构建集成还是使用 geo_engine 之类的包,升级安全层已不再是可选项——它是必要的。

📦 在 Pub.dev 上查看 Geo‑Engine: https://pub.dev/packages/geo_engine_sdk

祝编码愉快,保持安全!

Back to Blog

相关文章

阅读更多 »

从意大利面代码到Lazarus协议

我们是如何构建 Offline‑First Engineering App 的 https://www.kfirst.in/ 我并不是一开始就想要开发软件。我是因为需要可靠的系统而开始的……

安全是关于安全失效的

系统会出现故障。人们会犯错。安全并不是假装不会出现这些情况,而是确保故障是可承受的。良好的安全设计:- l...