我的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 %>
因此,我希望采用防篡改的方式来区分来自不同网页的新注册。我认为这意味着从表单数据中保留任何表示令牌。
有关探索方法的任何建议吗?
答案 0 :(得分:0)
最终目的是什么?
如果要知道哪些注册表单具有更高的转化率,那么您正在重新发明轮子,您应该看看A/B testing和those gems是否正确。
答案 1 :(得分:0)
如果您的目标是在@color
和new
操作之间安全地传递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中,并加密签名以使其防篡改。它也是加密的,因此任何有权访问它的人都无法读取其内容。