【发布时间】:2019-12-13 15:11:18
【问题描述】:
我正在迁移到 ActiveStorage 一个权限敏感的应用程序。我需要确保只有具有权限的人才能访问文件,并且这些权限仅持续指定的时间段。
使用 Paperclip,这就像使用专家授权调用定义路由一样简单:
def thumbnail
authorize @record
redirect_to @record.thumbnail.expiring_url(300)
end
对/record/thumbnail 的任何调用都将由设计人员进行身份验证,由权威人士授权,然后重定向到带有过期网址的 S3。这是一个行之有效的过程。
转移到 ActiveStorage,我最初的想法是我会使用 service_url,但它只在我使用 S3 时才有效——它在测试中不起作用,如果我在本地也不起作用使用磁盘服务进行开发。实际的“正确”方法是使用url_for,或者在上面的示例中使用redirect_to url_for @record.thumbnail。
问题是,url_for 似乎发出了一个永久 url——它生成的 url 对任何人都是有效的,无需身份验证或授权。更重要的是,一旦有人有了那个网址,我就不能撤销它,我不能说它只能维持一个星期。一旦有人拥有该网址,他们就可以永远访问该文件。 (或者,可能至少在文件更新之前)。
我不认为这是一个巨大的安全漏洞,但与使用 Paperclip 所能实现的相比,这绝对是一个倒退。我是否遗漏了一个重要的细节,或者这真的是 ActiveStorage 的全部功能吗?
【问题讨论】:
-
我很困惑,当我使用 image_tag(@record.thumbnail) 或 image_tag(url_for(@record.thumbnail) 时,我得到一个只持续几分钟的 url 重定向。你做了什么获得永久网址?每当我尝试时,我只能得到持续几分钟且无法缓存或与 CDN 一起使用的内容永久网址可能对你来说是个问题,但它是包括我在内的很多人的解决方案。你有不小心找到了解决我们问题的方法?
-
@JohnSmall 不知道。可能是版本问题?也许链接没有我想的那么好(尽管这应该会导致我们的一些应用程序出现问题,这些应用程序需要链接长时间保持有效,以便他们可以重新连接下载)