Rails, как само собой разумеющееся, считает, что все GET-запросы должны быть идемпотентными. Это означает, что Rails, конечно, не проверяет токены подлинности для запросов GET, даже Verified_request? дает каждому ПОЛУЧИТЬ пропуск.
def verified_request?
!protect_against_forgery? ||
request.method == :get ||
!verifiable_request_format? ||
form_authenticity_token == params[request_forgery_protection_token]
end
Итак, мы должны написать нашу собственную логику. Мы можем использовать токен form_authenticity. Все это создает случайную строку и кеширует ее в сеансе:
def form_authenticity_token
session[:_csrf_token] ||= ActiveSupport::SecureRandom.base64(32)
end
Поэтому мы можем создать фильтр before, который проверяет равенство параметра url токену сеанса. Тем самым гарантируя, что только добросовестные посетители могут просматривать видео.
Контроллер:
class CDNController < ActionController::Base
# You probably only want to verify the show action
before_filter :verify_request, :only => 'show'
# Regular controller actions…
protected
def verify_request
# Correct HTTP response code is 403 forbidden, not 404 not found.
render(:status => 403) unless form_authenticity_token == params[:token]
end
end
Вид:
<%= video_path(:token => form_authenticity_token) %>