首页 > 解决方案 > 如何确保 ActiveStorage URL 实际过期?

问题描述

编辑: 在Rails 讨论组中继续讨论。

现在这个猴子补丁做了诀窍(应用它ActiveStorage::Blob.include(ActiveStorageBlobMonkeyPatch)):

module ActiveStorageBlobMonkeyPatch
  extend ActiveSupport::Concern

  included do
    def signed_id
      ActiveStorage.verifier.generate(id, purpose: :blob_id, expires_in: 5.minutes)
    end
  end
end

原始问题

如果我加载一个包含指向 ActiveStorage 附件 (*) 的 URL 的页面,等待超过 5 分钟,从源代码复制 URL 并将其粘贴到浏览器中,它加载正常,尽管我预计它会因为到期时间而失败被超过。这似乎是因为 URL 的 base64 编码部分包含"exp"=>nil

url = app.url_for(post.cover_image)
params = url[/blobs\/(.*)--/,1]
JSON.parse(Base64.decode64(params))
=> {"_rails"=>{"message"=>"BAhpJA==", "exp"=>nil, "pur"=>"blob_id"}}

只有在查询该 URL 之后,它才会执行 302 重定向,这会导致一个新的 URL,该 URL 本身确实包含未来 5 分钟的到期时间。

如何使用 ActiveStorage 保护图像和其他类型的敏感内容(例如仅限订阅)?如何确保附件及其变体的 URL 将来无法下载?

Post(*) 使用带有s 配置has_one_attached :cover_image并使用 ActiveStorage 磁盘服务的 Rails 6.0.2.2 应用程序进行测试。config.active_storage.service_urls_expire_in未定义,因此默认为 5 分钟。帖子是用style="background-image: url(#{url_for post.cover_image)})"(为简单起见不使用变体)渲染的。页面源中背景图片的 URL 具有这样的结构/rails/active_storage/blobs/XXX--YYY/ZZZ.jpg,其中 XXX 是 Base64 编码的部分。

标签: ruby-on-railsrails-activestorage

解决方案


推荐阅读