如何限制Firebase Cloud Function仅接收Firebase Hosting站点的请求
可行解决方案
以下方案可以单独使用,也可以组合叠加获得更高的防护等级:
方案1:增强App Check校验逻辑,弥补令牌盗用漏洞
针对你当前App Check的实现缺陷,可以通过以下调整大幅降低风险:
- 调低reCAPTCHA v3令牌有效期:在Google reCAPTCHA控制台将默认1小时的有效期改为5~10分钟,大幅缩小令牌被盗用后的可用时间窗口
- 服务端增加额外校验规则:在
firebase-admin校验App Check令牌通过后,额外校验令牌的hostname字段必须匹配你的Firebase Hosting绑定域名,不匹配直接返回403 - 附Express适配的校验中间件代码参考:
const admin = require('firebase-admin'); admin.initializeApp(); const appCheckValidateMiddleware = async (req, res, next) => { const token = req.headers['x-firebase-appcheck']; if (!token) return res.status(401).send('Missing App Check token'); try { const verifyResult = await admin.appCheck().verifyToken(token); // 额外校验域名 if (verifyResult.token.hostname !== '你的Firebase Hosting绑定域名') { return res.status(403).send('Invalid request source'); } next(); } catch (err) { return res.status(401).send('Invalid App Check token'); } }; // 全局注册中间件,所有接口都会经过校验 app.use(appCheckValidateMiddleware);
方案2:Firebase Hosting反向代理+内网访问限制(优先推荐)
该方案从网络层面彻底切断公网直接访问云函数的路径,完全避免非法调用:
- 第一步:配置Firebase Hosting重写规则,在项目的
firebase.json中添加如下配置,将所有API请求代理到你的Express云函数:
{ "hosting": { "public": "你的静态资源目录", "rewrites": [ { "source": "/api/**", "function": "你的Express云函数部署名称" } ] } }
- 第二步:将Web应用的API请求地址改为同域名的
/api/xxx路径,而非直接调用云函数的cloudfunctions.net域名,此时API请求和Web应用同源,完全不存在跨域问题 - 第三步:在Google Cloud控制台调整云函数的Ingress Settings为仅允许内部流量和Cloud Load Balancing,公网直接访问云函数域名会被直接拦截,只有Firebase Hosting代理的内部流量可以到达云函数
方案3:叠加速率限制规则,避免超额账单
在方案2的基础上,可以额外配置速率限制,彻底避免高频调用产生的额外费用:
- 在Google Cloud控制台开通Cloud Armor服务,绑定到Firebase Hosting对应的负载均衡实例
- 配置速率限制规则:针对
/api/**路径,设置单IP每分钟最多允许请求30~100次(可根据业务需求调整),超出阈值的请求直接返回429状态码,不会触发云函数执行 - 无需修改业务代码,所有规则在网关层面生效
内容的提问来源于stack exchange,提问作者robila
相关产品推荐
相关产品推荐

