ruby-on-rails guide中文 - Rails 4真实性令牌




rails安全 view教程 (12)

当你定义你自己的html表单时,你必须包含身份验证令牌字符串,出于安全原因应该发送给控制器。 如果您使用Rails表单助手来生成真实性标记,则按以下方式添加到表单中。

<form accept-charset="UTF-8" action="/login/signin" method="post">
  <div style="display:none">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="authenticity_token" type="hidden" value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA=">
  </div>
    ...
</form>

所以解决这个问题的办法是添加authenticity_token字段或者使用rails形式助手而不是安全等。

当我遇到一些真实性令牌问题时,我正在研究一个新的Rails 4应用程序(在Ruby 2.0.0-p0上)。

在编写响应json的控制器时(使用respond_to类方法),当我尝试使用curl创建记录时,我开始获取Action ActionController::InvalidAuthenticityToken异常的create动作。

我确定我设置了-H "Content-Type: application/json"并使用-d "<my data here>"设置数据,但仍然没有运气。

我尝试使用Rails 3.2编写相同的控制器(在Ruby 1.9.3上),并且我没有任何真实性令牌问题。 我搜索了四周,我发现Rails 4中的真实性令牌发生了一些变化。根据我的理解,它们不再自动插入到表单中了? 我想这会以某种方式影响非HTML内容类型。

有没有什么办法可以解决这个问题,而无需请求一个HTML表单,抢走真实性标记,然后用该标记发出另一个请求? 还是我完全错过了一些完全明显的东西?

编辑:我刚刚尝试使用脚手架在新的Rails 4应用程序中创建新记录而不更改任何内容,而且我遇到了同样的问题,所以我想这不是我所做的。



不要关闭csrf保护,最好将以下代码行添加到表单中

<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %> 

如果您使用form_for或form_tag生成表单,则它会自动在表单中添加上面的代码行



将以下行添加到表单为我工作:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

我想我只是想出了它。 我改变了(新)默认值

protect_from_forgery with: :exception

protect_from_forgery with: :null_session

根据ApplicationController的注释。

# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.

您可以通过查看request_forgery_protecton.rb的源代码,或者更具体地看以下几行来查看它们的区别:

Rails 3.2中

# This is the method that defines the application behavior when a request is found to be unverified.
# By default, \Rails resets the session when it finds an unverified request.
def handle_unverified_request
  reset_session
end

Rails 4中

def handle_unverified_request
  forgery_protection_strategy.new(self).handle_unverified_request
end

这将调用以下内容

def handle_unverified_request
  raise ActionController::InvalidAuthenticityToken
end

authenticity_token: true添加到表单标记


这些功能是为了安全和伪造保护目的而添加的。
但是,要回答你的问题,这里有一些输入。 您可以在控制器名称后添加这些行。

像这样,

class NameController < ApplicationController
    skip_before_action :verify_authenticity_token

以下是不同版本的导轨的一些行。

Rails 3

skip_before_filter:verify_authenticity_token

Rails 4

skip_before_action:verify_authenticity_token


如果您打算为所有控制器例程禁用此安全功能,则可以在application_controller.rb文件中将protect_from_forgery的值更改:null_session

像这样,

class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session
end

如果您使用带有rails的jQuery,请小心在不验证真实性标记的情况下允许进入方法。

jquery-ujs可以为你管理令牌

您应该已经将它作为jquery-rails gem的一部分,但是您可能需要将它包含在application.js中

//= require jquery_ujs

这就是你所需要的 - 你的ajax调用现在应该可以工作

有关更多信息,请参阅: https://github.com/rails/jquery-ujshttps://github.com/rails/jquery-ujs


遇到同样的问题。 通过添加到我的控制器来修复它:

      skip_before_filter :verify_authenticity_token, if: :json_request?

你试过了吗?

 protect_from_forgery with: :null_session, if: Proc.new {|c| c.request.format.json? }

如果你想具体,意思是说,你知道你需要的路径:

link_to current_path(@resource, :only_path => false), current_path(@resource)




ruby-on-rails ruby ruby-on-rails-4 authenticity-token