Firebase存储:获取文件相对路径的安全方法? (存储HTML文件)

时间:2019-03-05 11:05:30

标签: firebase google-cloud-storage firebase-storage firebase-security banner

您好StackOverflow和Firebase社区!

我正在尝试实现Firebase可能无法实现的目标:我想在Firebase Storage中存储HTML文件夹(本例中为横幅广告)。

我的问题是:如何保持从HTML文件到相关JS和图像文件的相对路径

因此,这些文件可以轻松找到彼此:

  

/path/to/my/folder/index.html

     

/path/to/my/folder/main.js

     

/path/to/my/folder/picture.jpg

<html>
...
<script src="main.js">
...
</html>
document.onload = function() {
    myImage.src = 'picture.jpg'
}

如果我将所有文件存储在Firebase Storage上,并使用它们的DownloadURL(看起来像https://firebasestorage.googleapis.com/v0/b/my-project.appspot.com/o/my_folder_300x250%2Findex.html?alt=media&token=12a123a1-1234-1a1a-1234-a1ab123456a1

)访问这些相对URL,则这些URL将不起作用

通过打开Firebase的安全规则,我可以使文件无需令牌即可访问,但是由于URL参数和相对路径被转义,相对路径仍然被破坏。

我还通过公开了Google Cloud Storage存储桶,使其可以在其他项目上使用。我可以使用https://my-project.appspot.com.storage.googleapis.com/path/to/my/folder/my_folder_300x250/index.html这样的URL访问文件并保留相对路径。这很好用,但是有主要的安全漏洞,我想阻止它,例如列出存储桶中的所有文件


我试图将横幅保存为zip文件,在前端将其解压缩,然后使用FileSystem API在浏览器中重新创建文件夹结构。但是我仅限于Chrome。


我也可以尝试替换HTML,JS和CSS文件中的所有URL,但这并不是一个好的解决方案。

2 个答案:

答案 0 :(得分:0)

Firebase Storage围绕Cloud Storage构建,Cloud Storage实际上没有目录,而是一个平面命名空间。目录通过存储对象命名约定进行仿真:名称可以包含/字符,并在对象名称的开头放置“目录”路径,使该对象看起来像在该“目录”中。看到 How Subdirectories Work

因此,您唯一的解决方案(如果要独立存储文件)是处理所有引用,将“路径”设为绝对,并相应地命名文件。如您所见,您可能还需要考虑所有URL查询参数。

答案 1 :(得分:0)

我找到了一个非常简单的解决方案:

我在Google Cloud Console中创建了一个具有访问权限但没有列表访问权限的新角色,并将其应用于具有以下权限的allUsers

  

resourcemanager.projects.get

     

storage.objects.get

这将暂时解决我的问题,我将继续使用https://my-project.appspot.com.storage.googleapis.com/path/to/my/folder/my_folder_300x250/index.html之类的链接访问数据,而不是使用Firebase的downloadURL()。