Firestore Subscribers集合安全规则优化及数据安全性咨询
Firestore订阅功能安全增强方案及ID一致性验证
一、验证更新请求中邮箱与文档ID一致
因为你用邮箱作为文档ID,核心是确保写入/更新的数据里的邮箱和文档ID严格匹配,这可以通过Firestore安全规则强制实现,同时限制可写入的字段,避免恶意数据注入:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /Subscribers/{emailDocId} { // 创建文档:强制邮箱字段等于文档ID,且仅允许写入订阅日期字段 allow create: if request.resource.data.email == emailDocId && request.resource.data.size() == 2 // 仅包含email和subscribeDate && request.resource.data.keys().hasOnly(['email', 'subscribeDate']); // 更新文档:禁止修改邮箱字段(若业务需更新权限则改为request.resource.data.email == emailDocId),仅允许更新订阅日期 allow update: if !('email' in request.resource.data) && request.resource.data.size() == 1 && 'subscribeDate' in request.resource.data; } } }
说明:
- 创建时直接绑定文档ID与数据中的邮箱字段,杜绝ID和邮箱不匹配的情况;
- 更新时直接禁止修改邮箱字段(如果业务不需要更新邮箱,这是最安全的做法),仅允许更新订阅日期,避免恶意篡改邮箱关联的文档。
二、额外安全防护措施
1. 启用Firebase App Check
App Check可以验证请求是否来自你的合法网站/应用,防止爬虫、恶意脚本批量提交无效邮箱。只需在前端集成App Check SDK,然后在Firestore安全规则中添加验证:
allow create, update: if request.app != null;
2. 前后端双重邮箱格式验证
- 前端:用正则表达式先校验邮箱格式(比如
/^[^\s@]+@[^\s@]+\.[^\s@]+$/),拦截明显无效的输入; - 后端/云函数:在写入Firestore前再次验证邮箱格式,避免前端校验被绕过。
3. 防止重复提交与垃圾数据
- 前端:点击订阅按钮后立即禁用按钮,避免用户重复点击;
- Firestore逻辑:如果文档已存在,仅更新
subscribeDate而非重复创建,同时安全规则允许对已存在文档的更新操作。
4. 邮箱确认机制
添加邮件验证流程:用户提交邮箱后,发送带确认链接的邮件,用户点击后才将文档标记为verified: true;可通过云函数定时清理未验证的文档,同时后续邮件推送仅针对已验证的邮箱。
5. 限制请求频率
通过云函数处理订阅请求,配合IP限制,同一IP在短时间内只能提交有限次数的订阅请求,防止批量垃圾提交。
内容的提问来源于stack exchange,提问作者sammy333
相关产品推荐
相关产品推荐

