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

如何保障对接Firebase的Next.js API安全,避免会员权限被恶意篡改

基于Next.js + Firebase的会员权限API安全改造方案

核心问题诊断

你原流程的核心风险是接口未做身份校验、未校验操作合法性,任何人只要拿到接口地址,传入任意用户邮箱就能修改其会员等级,属于完全未设防的状态。

具体落地实现

  • 第一步:接入Firebase Auth ID Token做身份校验,不需要自研令牌体系
    所有客户端(Web/React Native)调用接口时,必须在请求头携带当前登录用户的ID Token,格式为Authorization: Bearer <你的ID Token>,Web端通过Firebase Auth的currentUser.getIdToken()方法获取,React Native端通过react-native-firebase库的同名方法获取,两端逻辑完全一致。
    Next.js API侧用Firebase Admin SDK校验Token合法性,直接从校验通过的Token中取用户uid,完全不要信任客户端传入的email/uid参数,避免越权修改他人账号信息,示例代码如下:
    // pages/api/update-premium.ts (App Router写法逻辑相同)
    import admin from '@/lib/firebase-admin'; // 提前初始化好admin SDK
    import type { NextApiRequest, NextApiResponse } from 'next';
    
    export default async function handler(req: NextApiRequest, res: NextApiResponse) {
      if (req.method !== 'POST') return res.status(405).json({ msg: '不支持的请求方法' });
      
      // 提取请求头的Token
      const authHeader = req.headers.authorization;
      if (!authHeader?.startsWith('Bearer ')) return res.status(401).json({ msg: '未授权访问' });
      const idToken = authHeader.split(' ')[1];
    
      try {
        // 校验Token合法性,过期、伪造的Token会直接抛出错误
        const decodedUser = await admin.auth().verifyIdToken(idToken);
        const operateUid = decodedUser.uid; // 操作人uid,从Token取,不相信客户端传参
    
        // 后续业务逻辑
      } catch (err) {
        return res.status(401).json({ msg: '身份校验失败' });
      }
    }
    
  • 第二步:补充操作合法性校验,禁止客户端直接指定会员等级修改
    会员等级的修改只能通过3个可信触发源,禁止前端直接传目标等级调用接口:
    1. 支付成功回调:用户点击升级按钮后先走支付流程,支付平台异步通知你服务端支付成功,你再根据回调里的用户信息修改对应账号的会员等级,该回调接口你自行配置签名校验,不对外暴露
    2. 定时自动降级:会员到期自动降级的逻辑放在服务端定时任务中执行,完全不提供对外调用接口,避免被恶意触发
    3. 管理员后台操作:如果有手动改等级的需求,单独给管理员账号加Firebase自定义声明,接口校验Token中存在admin: true的声明才允许操作
  • 第三步:新增Firestore安全规则兜底
    即使API层出现漏洞,Firestore层面也拦截非法修改,规则示例:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /users/{uid} {
          // 普通用户只能读自己的数据,不能修改premium字段
          allow read: if request.auth != null && request.auth.uid == uid;
          allow update: if request.auth != null && request.auth.uid == uid && !("premium" in request.resource.data);
        }
      }
    }
    
    该规则会拦截所有普通用户直接修改premium字段的请求,只有你的服务端Admin SDK(默认跳过安全规则)可以修改该字段。

额外加固建议

  • 接口增加请求频率限制,同一个uid1分钟内最多调用3次相关接口,避免恶意批量试探
  • 所有会员等级变更操作留痕,单独存储操作日志,记录操作时间、操作人uid、修改前后等级、操作触发源,方便后续溯源
  • 敏感操作可以额外加短验证码校验,比如降级操作要求用户输入短信验证码确认后再执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:06:04