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

Firebase Auth如何区分真实用户与黑客?UID泄露后该如何防护?

核心问题根因

你当前的安全漏洞本质是后端身份校验逻辑完全缺失,仅校验uid合法性不等于校验请求发起者的身份。uid本身是半公开标识,很容易被推导或泄露,绝对不能单独作为身份凭证使用。


最佳处理方案

1. 调整前端请求逻辑,不传uid、传ID Token

用户登录成功后,不要直接在请求参数里携带uid,而是通过firebase.auth().currentUser.getIdToken()获取有效期仅1小时的JWT身份凭证,放到请求头中传递,示例格式:
Authorization: Bearer <实际获取的ID_TOKEN>

2. 后端完全依赖Token校验获取可信uid

用Firebase Admin SDK的verifyIdToken方法校验传入的ID Token,校验通过后提取的uid是官方签名颁发的,绝对无法被伪造,完全不要信任前端传入的任何uid参数。
Node.js代码示例:

// 从请求头提取ID Token
const idToken = req.headers.authorization?.split('Bearer ')[1];
if (!idToken) return res.status(401).send('未授权访问');
try {
  // 校验Token合法性:是否过期、是否被吊销、是否为当前项目颁发
  const decodedToken = await admin.auth().verifyIdToken(idToken);
  const validUid = decodedToken.uid; // 这里拿到的uid100%可信
  // 后续用这个validUid查询数据库返回对应数据即可
} catch (error) {
  return res.status(401).send('身份校验失败');
}

3. 增加Firestore安全规则做兜底防护

即使后端逻辑出现漏洞,Firebase层面也要加规则限制,仅允许用户访问自己的数据:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 假设你的用户数据存在users集合下,文档ID为uid
    match /users/{uid}/{document=**} {
      allow read, write: if request.auth != null && request.auth.uid == uid;
    }
  }
}

4. 补充异常场景处理逻辑

用户修改密码后,主动调用Admin SDK的admin.auth().revokeRefreshTokens(uid)方法,吊销该用户所有历史生效的刷新凭证,之前颁发的所有ID Token到期后就无法续期,黑客就算拿到了旧的Token也无法继续访问。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:06:08