Rails AuthenticityToken 自动保护 POST/PUT/DELETE 请求免受 CSRF 攻击。但我想到了另一个用例。
我在我的网站上展示了一个不想嵌入其他网站的视频。这是如何工作的,我的 Flash 播放器从我的 CDN 发送一个签名 URL 的请求,该请求将在几秒钟内过期。到目前为止,用户必须登录才能观看视频,这就是身份验证。但是,现在我希望该站点的任何访问者都能够观看视频,而不允许从另一个站点请求签名 URL(例如,如果他们将我们的播放器嵌入到他们的站点中)。
我的第一个想法是 AuthenticityToken,因为它似乎具有这些确切的语义……我需要做的就是将其插入到 GET 请求中。有任何想法吗?
最佳答案
Rails,固执己见,因为它认为所有 GET 请求都应该是幂等的。这意味着 Rails 当然不会检查 GET 请求的真实性 token ,甚至是 Verified_request?给每个 GET 一个通行证。
def verified_request?
!protect_against_forgery? ||
request.method == :get ||
!verifiable_request_format? ||
form_authenticity_token == params[request_forgery_protection_token]
end
所以我们必须编写自己的逻辑。我们可以使用 form_authenticity token 。所有这些都是创建一个随机字符串并将其缓存在 session 中:
def form_authenticity_token
session[:_csrf_token] ||= ActiveSupport::SecureRandom.base64(32)
end
因此,我们可以创建一个 before 过滤器来测试 url 参数与 session token 的相等性。从而确保只有真正的访问者才能观看视频。
Controller :
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) %>
关于ruby-on-rails - 如何使用 Rails AuthenticityToken 基础设施来明确保护 GET 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1848532/