Firebase实时数据库安全规则配置:防止机器人高频发帖需求
Firebase实时数据库安全规则:限制发帖频率(每秒1条)
需求回顾
- 仅认证用户可写入
- 新增帖子(
items下的新节点)需满足:当前帖子created_timestamp与该用户在同一群组下的最后一条帖子时间差≥1000ms - 批量删除/更新无额外限制,仅需认证
实现方案
利用Firebase实时数据库规则的查询能力,针对新增操作校验用户最近的发帖时间,同时放开更新/删除操作的限制。以下是完整规则:
{ "rules": { "new_groups": { ".read": "auth.uid != null", "$groupId": { "items": { "$itemId": { ".write": "auth.uid != null && ( // 更新或删除操作:仅需认证 (data.exists() && newData.exists()) || !newData.exists() || // 新增操作:需满足时间限制+作者匹配 (!data.exists() && newData.exists() && newData.child('authorId').val() === auth.uid && // 查询该用户在当前群组的最后一条帖子,验证时间差 (!root.child('new_groups').child($groupId).child('items').orderByChild('authorId').equalTo(auth.uid).limitToLast(1).exists() || newData.child('created_timestamp').val() - root.child('new_groups').child($groupId).child('items').orderByChild('authorId').equalTo(auth.uid).limitToLast(1).child('created_timestamp').val() >= 1000) ) )" } } } } } }
规则关键点说明
- 基础认证校验:所有写入操作都要求
auth.uid != null,满足需求1。 - 操作类型区分:
- 更新(
data.exists() && newData.exists())或删除(!newData.exists())时,仅需认证,满足需求3中批量操作无额外限制的要求。 - 新增(
!data.exists() && newData.exists())时,额外校验:authorId与当前用户UID一致,确保用户只能发布自己的帖子。- 查询该用户在当前群组下的最后一条帖子:
- 若用户是首次发帖(无历史记录),直接允许。
- 若有历史记录,计算当前时间戳与最后一条帖子的时间差≥1000ms,满足需求2的频率限制。
- 更新(
注意事项
- 客户端写入时,
created_timestamp必须使用Firebase服务器时间(通过firebase.database.ServerValue.TIMESTAMP获取),避免客户端篡改时间绕过限制。 - 规则默认限制单个群组内的发帖频率,若需全局跨群组限制,可修改查询路径为遍历所有群组的
items节点,但性能上建议按群组拆分限制。
内容的提问来源于stack exchange,提问作者Tomas Ward
相关产品推荐
相关产品推荐

