我目前正在开发一个由 Rails 提供支持的头像应用程序,用户可以在其中为他们的用户个人资料上传头像。
我想使用自定义 HTTP 标头来阻止公共上传请求,并且只允许来自我的应用程序的请求。我将如何使用 Ruby on Rails 执行此操作?
我正在使用 AJAX 上传头像,所以这可能有点困难。此外,我不希望在公共 HTML 代码中显示标题,否则它会破坏添加它的对象!
我目前正在开发一个由 Rails 提供支持的头像应用程序,用户可以在其中为他们的用户个人资料上传头像。
我想使用自定义 HTTP 标头来阻止公共上传请求,并且只允许来自我的应用程序的请求。我将如何使用 Ruby on Rails 执行此操作?
我正在使用 AJAX 上传头像,所以这可能有点困难。此外,我不希望在公共 HTML 代码中显示标题,否则它会破坏添加它的对象!
如果你添加
protect_from_forgery
到您的应用程序控制器,它将阻止来自 3rd 方链接的所有 NON Get 请求。它将使用身份验证令牌向每个表单添加一个隐藏的输入值,该身份验证令牌将用于检查发送到服务器的所有数据。
进一步阅读
http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf
http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
您可以实现自定义 HTTP 标头(例如X-Foobar-Validity-Status: valid
)并将其签入before_filter
.
class YourController < ApplicationController
before_filter :check_header
def check_header
unless request.headers['X-Foobar-Validity-Status'] == "valid"
render json: {"error" => "You are an evil attacker. Go away"}
end
end
end
但是,我认为这是一个坏主意。
jQuery.ajax
标题选项。User-Agent
为此目的使用,而不是使用专有标头。相反,我建议使用protect_from_forgery
导轨机制。它使您的生活更轻松,更安全。只需在您的应用程序中通过 http 请求获取真实性令牌,然后将其与您的请求一起发回。这应该可以阻止入侵者。