Rails - 解决真实性令牌问题

时间:2013-07-23 04:36:22

标签: ruby-on-rails token authenticity

我有一个有趣的挑战要解决旧的Rails 2.0.2应用程序(在更新到Rails 4的过程中,但我不能等待那么久才能解决这个问题)。问题是:我们即将发布离线内容,旨在最终将用户上线到我们的网站。在从离线到在线的过渡中,有一个他们离线填写的表格,但我们希望能够将数据发布到表格的在线版本而无需用户必须填写两次相同的表格。我看到的问题是如何处理在线版本中更改的真实性令牌。任何人对我们如何解决这个问题有任何建议。我理解真实性令牌的目的是为了防止我正在尝试做但我可以解决它,例如,通过某种方式使用离线版本的数据预填充在线版本?我不认为我可以重现当前正在运行的真实性令牌/会话对,除非我能以某种方式将相同的session_id写入在线表单域的cookie中?或许我必须在服务器端解决它?我试图避免为此问题设置自定义代码服务器端... 提前感谢任何回复。

1 个答案:

答案 0 :(得分:1)

不是POST到在线表单,而是使用查询字符串获取在线表单和预填充字段

例如,具有名字和姓氏的离线表单在提交时将执行如下的GET请求:

mysite.com/offline_form/new?first_name=Dick&last_name=Steele  

此网址将呈现实时new表单,并附带有效的CSRF令牌。使用查询字符串填充输入字段。可以通过params[]访问查询字符串。

form_for :online do |f|
  f.text_field :first_name, value: params[:first_name]
  f.text_field :last_name, value: params[:last_name]
  # ...
end  

这样,您的用户就可以提交实时CSRF标记化表单,而无需填写第二个表单。至少,您的用户必须单击两个提交按钮。您可以将表单的在线版本作为确认步骤。