如何阻止用户表单向表单添加表单?

时间:2012-01-25 12:28:47

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我有一个允许用户更新其个人资料信息的表单,但我想阻止某些信息被更改。我还想保持我的控制器代码非常简单。在我的用户控制器的更新操作中,我有以下代码:

def update
  @user = Users.find params[:id]

  if @user.update_attributes(params[:user])
    flash[:notice] = 'Update successful.'
    redirect_to user_path(@user)
  else
    render :action => :edit
  end
end

这很干净简单,我喜欢这样。但是,我不喜欢的是,用户可以向表单添加一个字段,其名称与属性相同,并使用它来修改禁用的属性。有没有一种简单的方法可以做到这一点,还是我需要自己设计一种方法来做到这一点?

我正在考虑的一种方法是使用hash-based message authentication code生成所有表单元素名称的哈希值。此消息访问代码将是表单中的隐藏值。然后,一旦提交表单,我将使用参数Hash的键的名称再次计算消息访问代码(MAC)。如果两个MAC不同,或者参数Hash中缺少第一个MAC,我会抛出错误。如果已经有一个简单的解决方案,我宁愿不花时间实现这个。

感谢。

2 个答案:

答案 0 :(得分:1)

在您的模型上,您可以使用attr_protectedattr_accessible在通过批量分配设置时将属性列入黑名单或白名单(例如提交表单时)。

答案 1 :(得分:1)

如果您在模型中使用attr_protected :protectedcolumn(黑名单)或attr_accessible :safecolumn(白名单),则Rails会阻止批量分配。有关此主题的更多信息,请参阅Ruby on Rails Security Guide (Section 6.1)