Защитить Rails Active Storage Direct Upload
8 января 2024

Проблема
При установке Rails Active Storage, он имеет открытые для всех посетителей сайта адреса POST /rails/active_storage/direct_uploads и PUT /rails/active_storage/disk/:encoded_token(.:format). Если оставить "как есть", то любой недобрый человек может забить ваш storage "под завязку" сохраняя туда кучи мусора.
Варианты решений
Первый вариант - отключить добавление в route путей Active Storage и "разруливать" самостоятельно:
# config/application.rb module MyBlog class Application < Rails::Application config.active_storage.draw_routes = false ...
В документации что-то есть по этому поводу. Там должно быть все понятно. Наверное. Это, вроде как, правильный вариант.
Второй вариант - защитить POST и PUT от неавторизованного доступа перехватив их. Подходит для ситуации, когда ограниченному круг доверенных пользователей дозволено загружать. Для этого говорим в каком порядке надо загружать модули, чтобы routes Active Storage добавились после наших
Второй вариант - защитить POST и PUT от неавторизованного доступа перехватив их. Подходит для ситуации, когда ограниченному круг доверенных пользователей дозволено загружать. Для этого говорим в каком порядке надо загружать модули, чтобы routes Active Storage добавились после наших
# config/application.rb module MyBlog class Application < Rails::Application config.railties_order = [:main_app, :all] ...
и перехватить запросы
# config/route.rb Rails.application.routes.draw do constraints(lambda { |request| !(request.session['is_auth'].eql? true) }) do post "/rails/*way", to: "pages#not_found" put "/rails/*way", to: "pages#not_found" end ...
*way - можно назвать и по-другому. Нельзя только * оставить одну. "pages#not_found" - может возвращать 404 или 204. Непринципиально.
request.session['is_auth'] выставляется при авторизации пользователя, который может загружать что-то через /rails/active_storage/direct_uploads
request.session['is_auth'] выставляется при авторизации пользователя, который может загружать что-то через /rails/active_storage/direct_uploads