如何防范恶意用户向Firebase Realtime Database写入大量冗余数据
Firebase Realtime Database 恶意写入防护方案
首先明确:云函数不是保障数据库安全的唯一方案,Firebase原生提供的安全规则、App Check等能力已经可以覆盖绝大多数恶意写入防护场景,你可以按照以下优先级配置防护:
1. 优先配置数据库安全规则(第一道核心防线)
永远不要开放公开写入权限,所有写入操作都要在规则侧做校验,而不是只依赖前端逻辑限制,示例规则如下:
{ "rules": { "post": { // 仅允许已认证用户写入 ".write": "auth != null", // 校验写入内容:必须为字符串、长度不超过500字 ".validate": "newData.child('content').isString() && newData.child('content').val().length <= 500", // 限制单用户写入频率:两次写入间隔至少60秒 "last_write_time": { ".validate": "newData.val() == now && (!data.parent().exists() || now - data.parent().child('last_write_time').val() > 60000)" } } } }
对应调整前端写入逻辑,强制带入服务端时间戳避免客户端伪造时间:
document.getElementById("sub").addEventListener("click", function() { var postText = document.getElementById("postbox").value; var firebaseRef = firebase.database().ref("post"); firebaseRef.set({ content: postText, last_write_time: firebase.database.ServerValue.TIMESTAMP }); });
规则会自动拦截不符合要求的写入请求,就算用户修改前端代码循环提交,也只会得到权限拒绝的返回,不会实际写入数据库。
2. 开启App Check拦截非官方客户端请求
Firebase App Check可以校验请求是否来自你官方发布的客户端,没有合法令牌的请求会直接被Firebase服务端拦截,哪怕用户拿到了你的项目配置信息,也无法随意调用数据库接口。
你只需要在Firebase控制台开启App Check,对应在前端初始化时加入App Check配置即可,不需要修改业务逻辑。
3. 用量阈值告警兜底
在Firebase控制台的「计费」板块配置用量警报,设置数据库读写次数、带宽、存储的安全阈值,达到阈值时自动发送通知,避免异常流量产生高额账单。
4. 云函数作为复杂场景的补充方案
如果你需要更复杂的业务校验逻辑(比如内容敏感词审核、多维度频率限制、用户权限分级等),可以关闭前端直接写入数据库的权限,改为前端调用云函数,所有写入逻辑都在云函数侧执行,云函数完成所有校验后再写入数据库,就算用户修改前端代码也只能触发你预定义的云函数逻辑,无法直接操作数据库。
内容的提问来源于stack exchange,提问作者blu potatos
相关产品推荐
相关产品推荐

