CSRF令牌验证| Ruby |耙子| PUT |

时间:2014-04-04 04:08:25

标签: ruby-on-rails ruby rake csrf put

我正在尝试使用针对特定ID的PUT Web服务更新数据。所以我的json请求就像

{
    id: 1,
    status: 'A'
}

我的网络服务需要CSRF令牌。所以我首先使用相同的URL进行GET并将header参数和值传递为

x-csrf-token => 'fetch'

GET给了我一个令牌,然后我在PUT的请求头中传递,但我仍然得到CSRF令牌验证失败。

我在RAKE任务中执行GET和PUT(当然使用Ruby on rails)。

Ruby版本2.0.0 Rails版本4.0.0

欢迎任何建议。

由于 阿布舍克巴克

1 个答案:

答案 0 :(得分:0)

来自Rails的代码

  # Returns true or false if a request is verified. Checks:
  #
  # * is it a GET or HEAD request?  Gets should be safe and idempotent
  # * Does the form_authenticity_token match the given token value from the params?
  # * Does the X-CSRF-Token header match the form_authenticity_token
  def verified_request?
    !protect_against_forgery? || request.get? || request.head? ||
      form_authenticity_token == params[request_forgery_protection_token] ||
      form_authenticity_token == request.headers['X-CSRF-Token']
  end

  # Sets the token value for the current session.
  def form_authenticity_token
    session[:_csrf_token] ||= SecureRandom.base64(32)
  end

我看待它的方式。如果您在GET请求中将令牌存储在session[:_csrf_token]中,然后在params[:authenticity_token]中的另一个请求中将其传递(默认),那么您应该没问题。