РЕДАКТИРОВАТЬ : Обсуждение продолжается в 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
Оригинальный вопрос :
Если я загружаю страницу, содержащую URL-адрес, во вложение ActiveStorage (*), подождите более 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, который сам по себе содержит срок действия. из 5 минут в будущем.
Как защитить изображения и другие типы конфиденциального содержимого (например, только по подписке) с ActiveStorage? Как гарантировать, что URL-адреса для вложений и их вариантов не будут загружаться в будущем?
(*) Протестировано с приложением Rails 6.0.2.2 с Post
s, настроенным с has_one_attached :cover_image
и использующим ActiveStorage служба дисков. 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.