能否确定请求源?能否获取Cloud Firestore请求源主机名并限制写入
好问题!先直接给你结论:Cloud Firestore 的安全规则无法直接获取传入请求的来源主机名,所以你没法直接通过校验 request.resource.data.source_host_name 来限制写入——除非你在客户端主动把主机名塞进请求数据里,但这种方式完全没有安全性,恶意用户可以轻松伪造这个字段的值,绕过你的规则。
下面给你几个不用传统用户认证就能限制Firestore写入权限的靠谱方案:
推荐方案:使用Firebase App Check
这是官方专门为这类场景设计的工具,能验证请求确实来自你的合法Web应用,不需要用户登录。具体做法是:
- 在Firebase控制台启用App Check,为你的Web应用配置reCAPTCHA v3(完全无感知,不会打扰用户)
- 在你的Web应用代码里集成App Check SDK,请求Firestore时会自动带上验证凭证
- 最后在Firestore安全规则里添加校验:
allow write: if request.app != null;
这样就能确保只有来自你配置的合法Web应用的请求才能写入,安全性有保障,而且实现起来也不复杂。
备选方案1:自定义签名验证(需自建后端)
如果你不想用App Check,可以自己搭建一个后端服务,生成包含请求来源信息的签名token。客户端请求Firestore前先向后端获取这个token,然后把token和数据一起提交,最后在Firestore安全规则里验证这个token的合法性。不过这种方式需要你自己维护签名逻辑、处理token过期等问题,复杂度比App Check高不少。
备选方案2:IP白名单(仅适用于固定IP场景)
如果你的Web应用是部署在固定IP的服务器上(比如自建的后端服务,由后端统一请求Firestore),可以在安全规则里校验请求的IP是否在你的白名单范围内:
allow write: if request.ip in ['192.168.1.1', 'xxx.xxx.xxx.xxx'];
但如果是前端直接调用Firestore SDK(用户浏览器发起请求),这个方法就不适用了,因为用户的IP是动态变化的,没法覆盖所有合法用户的IP。
最后再强调一遍:绝对不要依赖客户端传入的source_host_name做权限校验,这种方式毫无安全性可言,恶意用户可以轻松篡改这个字段的值,绕过你的规则。
内容的提问来源于stack exchange,提问作者adbo

