区分相同用户模型的多个注册页面

时间:2014-10-22 22:32:11

标签: ruby-on-rails ruby-on-rails-4 registration

我的Rails 4应用程序有一个相当普通的注册系统,我想添加一个奇怪的功能。我想提供多个注册表单,并根据提交数据的页面,在新的User对象上秘密设置一个值。

出于安全考虑,我目前的做法很糟糕。它运行正常,但精明的用户可以使用浏览器的开发工具来更改隐藏字段的值,并指示它们来自不同的页面。

的routes.rb

get '/signup', to: 'users#new'
get '/red-signup',  to: 'users#new', color: 'red'
get '/blue-signup',  to: 'users#new', color: 'blue'

users_controller.rb

def new
  @user = User.new
  @color = params[:color] || 'grey'  # default of grey
end

用户/ new.html.erb

<%= form_for(@user) do |f| %>
  ...
  <%= f.hidden_field :color, value: @color %>   # VULNERABLE TO TAMPERING
  <%= f.submit "Create my account" %>
<% end %>

因此,我希望采用防篡改的方式来区分来自不同网页的新注册。我认为这意味着从表单数据中保留任何表示令牌。

有关探索方法的任何建议吗?

2 个答案:

答案 0 :(得分:0)

最终目的是什么?

如果要知道哪些注册表单具有更高的转化率,那么您正在重新发明轮子,您应该看看A/B testingthose gems是否正确。

答案 1 :(得分:0)

如果您的目标是在@colornew操作之间安全地传递create值,则可以将会话用于此目的。在new操作中,您可以设置颜色:

def new
  @user = User.new
  session[:color] = params[:color] || 'grey'  # default of grey
end

然后在create操作中,您可以检索它:

def create
  @color = session[:color]  
end

Rails会话数据默认存储在Cookie中,并加密签名以使其防篡改。它也是加密的,因此任何有权访问它的人都无法读取其内容。