ruby-on-rails - 如何确保 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 编码的部分。
解决方案
推荐阅读
- java - 来自 HTML 文本的中文字符在某些网站上可以正确打印,但在其他网站上则不行
- machine-learning - 使用强化学习的手写文本比较
- python - 使用 Atom-editor 在 python 中打开文件
- list-comprehension - 如果元素是偶数,则将矩阵的每个元素除以 2
- dask - 使用 Dask 和 Lightgbm 对大型数据集进行评分/预测
- python - 在类之间传递 tkinter 画布而不从父级内部调用子级
- charts - 谷歌图表鼠标跳过数据点
- php - 使用 mysql 表中的 cron 作业安排电子邮件
- sqlite - 如何完全卸载并重新安装 sqlite?
- python - 如何准备 .WAV 文件以与 Scipy.Correlate 进行交叉相关以了解到达时间滞后