当前位置: 首页 > 知识库问答 >
问题:

验证火库实时网址是否来自火库存储

蒋权
2023-03-14

所以我在我的网站上有一个功能,允许用户上传个人资料照片。照片存储在我的 Firebase 存储中 UID 下的文件夹中,然后一旦成功上传,下载 URL 就会存储在我的 Firebase 实时数据库中的 UID 下,如下所示:

database.ref('users/'+firebase.auth().currentUser.uid).update({
profilePhoto: downloadURL
});

现在我已经有了一些规则,只有auth UID可以将数据写入自己。

{
"rules": { 
 "users": {
  ".read": "true",
  "$user": {
   ".read": "true",
   ".write": "auth.uid == $user",
    "profilePhoto": {
     ".validate": "newData.isString()
    },  
  }
 }
}
}

工作得很好,但是我怎样才能让它只写出直接来自我的Firebase存储的URL?

例如,有知识的用户可以简单地运行上面的脚本,将数据更改为存储之外的内容,或者只是一些随机的文本,当我获取它时会破坏配置文件图像。

我想做的一件事是添加Firebase存储“基本路径”作为验证,如下所示:

"profilePhoto": {
 ".validate": "newData.isString()
 && newData.val().contains('mystorage-12345.appspot.com/') 
}

但是有没有更好的方法来做到这一点?“基本路径”会改变吗?

共有1个答案

晏志明
2023-03-14

没有任何规则组合可以用来阻止用户链接到恶意文件或输入乱码。既然你愿意接受更好的方法,这就是我处理上传的标准模式。

首先,确定个人资料照片的URL结构,其中照片将以易于猜测的格式存储在您的存储桶中。我的偏好是:/u/

第二,为你的用户提供一个签名的URL来上传他们的图片。这可能是在一个单独的桶中,当一个新的对象出现时,触发一个函数调整照片的大小,然后将调整大小的照片移动到< code>/u/

最后,不需要存储个人资料照片的URL,因为任何用户的个人资料都可以这样显示:

<img src="https://<bucketUrl>/u/<uid>/profile_512x512.jpg" onerror="this.src=' + "/img/default-profile.jpg" + '" />

这里发生的事情是它首先尝试使用可猜测的/u/加载用户的个人资料照片

优势

  1. 由于数据库读取、写入和存储更少,成本更低。
  2. 简单、快速、可靠。
  3. 内置故障转移功能,以防因任何原因无法访问存储桶。

 类似资料:
  • 我是Firebase的菜鸟。我要求一种设置电子邮件验证的分步指南。 目前,我的应用程序使用基本电子邮件密码登录。我希望对用户进行验证,以便根据用户的电子邮件验证属性隐藏内容。我正在调用.sendEmailVerification(),它会发送到当前用户的电子邮件,但是,每当我单击电子邮件中的链接时,它都说该链接已过期或有人已使用它,这也不会更改属性。我怀疑这与api管理器有关。我目前已将我的网站托

  • Firebase的Cloud Firestore和Cloud Firestore有什么区别? 这里有一个帖子问同样的问题,但是有人,请启发我。 https://www.reddit.com/r/googlecloud/comments/bb9n46/what_is_the_difference_between_the_cloud/ 是一样的吗?如果没有,使用哪一个?

  • 我的nextjs webapp中有一个实时数据库,我用它来发送通知。 我的数据库的架构如下: 我仅以管理员身份从服务器端写入数据,但按以下方式从客户端读取数据: 在这一刻,我有以下规则: 正如您所看到的,每个经过身份验证的人都可以阅读所有内容。我希望用户只阅读他自己的通知。ObjectID是我的mongoDB中的引用。 例如,如果我的我只想访问路径的数据,如果我试图从,那么我什么也得不到(或错误)

  • 我正在用电子邮件和密码设置授权功能。一切正常,但当我创建一个新用户时,应用程序会发送一封带有验证链接的电子邮件。在我验证电子邮件地址后,我想登录,因此我返回登录表单。在我硬重新加载页面后,emial_。有人能帮我吗?

  • < code >在此输入代码我在android应用程序中有一个注册表,用户可以在其中输入他们的详细信息。我尝试将数据存储到firebase中,数据正在存储,但问题是电话号码、年龄和姓名都将被存储。如何解决这个问题?请帮帮忙! 助手类 公共类UserHelperClass { } 数据存储到Firebase代码 从其他活动获取数据 将数据传递给另一个活动 公共类注册活动扩展了应用程序兼容性活动 {