ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

安全视角看Messenger实时聊天App:Firebase Database Rules的风险与正确修复方案

安全视角看Messenger实时聊天App:Firebase Database Rules的风险与正确修复方案 安全视角看Messenger实时聊天AppFirebase Database Rules的风险与正确修复方案【免费下载链接】MessengeriOS - Real-time messaging app 项目地址: https://gitcode.com/gh_mirrors/messe/MessengerMessengermChat是一款基于 Swift Firebase 的 iOS 实时聊天App支持消息收发、好友网络与地图定位等完整功能。本文从安全视角拆解它的 Firebase Database 权限配置为什么 README 中推荐的.read: true, .write: true数据库规则是一个高危漏洞以及如何用基于auth.uid的最小权限规则正确修复。Messenger 如何用 Firebase 实现实时聊天从 Podfile 可以看到整个 App 的数据能力全部依赖 Firebase 三件套Firebase/Auth邮箱/密码登录Firebase/Database实时消息、好友关系、在线状态Firebase/Storage图片、音视频媒体文件数据被组织成若干扁平的节点客户端通过监听实现实时效果数据库节点作用相关源码users/{uid}昵称、头像、在线状态isOnlineUserActivity.swiftmessages/{uid}/{好友uid}双向冗余存储的消息ChatNetworking.swiftmessages/unread-Messages未读消息计数ChatNetworking.swiftfriendsList/friendRequests好友与好友请求ContactsNetworking.swiftuser-Location/{uid}用户实时经纬度ChatKit.swiftuserActions/{uid}/{好友uid}正在输入Typing状态ChatNetworking.swift发消息时App 会把同一条消息同时写入双方节点messages/我/你和messages/你/我并更新未读计数——这套结构是设计权限规则时必须理解的关键点。核心风险官方文档推荐了全公开的数据库规则在 README.md 的安装步骤第 7 步中项目明确要求将 Realtime Database 规则设置为{ rules: { .read: true, .write: true } }这意味着数据库对互联网完全敞开而 Firebase 数据库 URL 又随GoogleService-Info.plist打包在每个已安装 App 里——任何人都可以提取出来直接对 REST API 发起请求。攻击者能做什么拖库GET /?shallowfalse一次性拉取全部用户的昵称、邮箱、头像 URL✍️篡改与注入任意往messages/节点写入假消息、伪造已读状态好友请求轰炸向任意用户的friendRequests节点批量写入请求位置追踪user-Location节点每 20 秒更新一次真实经纬度见 ChatKit.swift在公开规则下这是最敏感的数据泄露点为什么App 里有登录不等于数据库安全Messenger 的登录走 Firebase Auth见 AuthNetworking.swift但上面的规则完全没有校验auth。客户端代码可以被抓包、重写真正的安全边界必须在数据库规则层。当前配置等于把门锁打开却指望路人自觉不进门。正确修复方案用 auth.uid 做最小权限规则修复思路只有一条把任何人可读可写改为只有认证用户能访问属于自己的数据。Firebase 规则中的auth.uid是当前登录用户的 ID与代码里CurrentUser.uid是同一个值。针对上面的节点结构推荐规则骨架如下{ rules: { users: { $uid: { .read: auth ! null, .write: auth.uid $uid } }, user-Location: { $uid: { .read: auth ! null, .write: auth.uid $uid } }, userActions: { $uid: { .read: auth ! null, .write: auth.uid $uid } }, messages: { $uid: { .read: auth ! null auth.uid $uid, $friendId: { .write: auth.uid $uid || auth.uid $friendId } } }, friendsList: { .read: auth ! null, .write: auth ! null } } }各节点的权限设计逻辑users/user-Location/userActions读取要求已登录聊天中展示头像、在线状态需要写入仅限本人节点$uid路径变量与auth.uid绑定后无法篡改他人资料或伪造他人位置messages读取仅限消息归属人auth.uid $uid防止窃听他人私聊写入允许发送方和接收方auth.uid $uid || auth.uid $friendId正好匹配代码中双向写入 更新对方未读计数的实现friendsList接受/拒绝请求需要修改对方节点见 FriendRequestNetworking.swift因此放宽为已登录即可写生产环境可进一步要求双方均为好友或以服务端 Cloud Functions 做二次校验 修改规则后务必在 Firebase 控制台的Rules 测试器中分别以未认证和认证用户身份逐节点验证再切出测试模式发布。配套加固清单Storage 同样要锁头像与媒体文件在ProfileImages、message-img等路径下见 AuthNetworking.swiftStorage 规则也应用auth ! null限制下载与上传位置数据最小化user-Location每 20 秒上报一次建议改为仅在用户开启定位且好友在线时才写入并在用户离线时删除敏感操作下沉到服务端如删除消息会同时删除 Storage 媒体文件ChatNetworking.swift跨服务的一致性操作更适合放在 Cloud Functions 中执行数据库 URL 不是秘密之外的秘密规则永远按客户端不可信设计业务逻辑校验如只能给好友发消息最终要靠服务端强制总结Messenger 用 Firebase Realtime Database 实现了非常干净的实时聊天架构但 README 中.read: true, .write: true的规则配置让所有用户数据——包括实时位置——对全网裸奔。正确做法是把权限判断下沉到规则层用auth ! null保证认证访问用auth.uid与路径变量绑定实现谁的数据谁负责并按消息双向存储的特点精确放行收发双方。对于任何使用 Firebase 的聊天、社交类项目这都是一份可以直接对照整改的安全基线。【免费下载链接】MessengeriOS - Real-time messaging app 项目地址: https://gitcode.com/gh_mirrors/messe/Messenger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表