无需Auth能否安全使用Firebase Firestore?表单数据存储规则咨询
无需用户登录的Firebase Firestore表单数据写入规则配置方案
这种场景并不小众,很多匿名表单工具都采用类似配置,核心是允许未登录用户仅创建新文档,同时严格限制其他操作以保证数据安全。以下是两种不同层级的规则配置方案:
基础安全规则
适用于只需要简单提交表单、无需额外数据校验的场景:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 替换成你的表单数据集合名称,比如form_submissions match /form_submissions/{document} { // 允许未登录用户创建新文档(表单提交) allow create: if request.auth == null; // 禁止任何用户修改或删除已提交的表单数据 allow update, delete: if false; // 禁止前端读取表单数据(若无需前端展示提交结果,保持此配置避免数据泄露) allow read: if false; } } }
规则说明
allow create: if request.auth == null;:直接放行未登录用户的文档创建请求,这是表单提交的核心逻辑。allow update, delete: if false;:彻底阻断篡改、删除已有数据的操作,确保提交的数据不可修改。allow read: if false;:如果你的应用不需要在前端展示已提交的表单内容,完全禁止读取权限,避免敏感数据泄露。
进阶安全规则(带数据校验+防刷)
如果需要保证提交数据的有效性、防止恶意垃圾提交,可以添加字段验证和频率限制:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /form_submissions/{document} { allow create: if request.auth == null // 验证必填字段存在且格式合法 && request.resource.data.keys().hasAll(['name', 'email', 'content']) && request.resource.data.name is string && request.resource.data.name.size() > 1 && request.resource.data.email is string && request.resource.data.email.matches('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$') && request.resource.data.content is string && request.resource.data.content.size() > 10 // 限制1分钟内只能提交一次(需前端提交时传入createdAt字段,值为当前时间戳) && request.time > request.resource.data.createdAt + duration.value(60, 's'); allow update, delete: if false; allow read: if false; } } }
规则说明
- 字段校验:确保提交的
name、email、content字段存在且符合格式要求,过滤空数据或无效内容。 - 频率限制:通过对比请求时间和提交的
createdAt字段,限制用户1分钟内只能提交一次,需要前端在提交时传入createdAt: firebase.firestore.Timestamp.now()。
额外注意事项
- 集合名称替换:将规则中的
form_submissions替换为你实际使用的Firestore集合名称。 - 后台数据读取:如果需要在后台查看表单数据,直接使用Firebase Admin SDK即可,Admin SDK不受安全规则限制,可自由读取所有数据。
- 监控异常:可以在Firebase控制台开启安全规则日志,监控异常写入请求,及时调整规则应对恶意攻击。
内容的提问来源于stack exchange,提问作者Henry Hudson
相关产品推荐
相关产品推荐

