这容易受到群众分配吗?

时间:2011-02-01 04:14:49

标签: ruby-on-rails-3 security mass-assignment

我用它来允许用户对条目进行投票:

 <% form_tag url_for(entry_votes_path(@entry)), :id => 'voting_form', :remote => true do %>
      <%= hidden_field_tag 'vote[user_id]', current_user.id  %>
      <%= submit_tag 'Vote for this entry', :id => 'voting_button' %>
 <% end %>

这是我的控制器代码:

def create
    @entry = Entry.find(params[:entry_id])
    @vote = @entry.votes.build(params[:vote])

    respond_to do |format|
    if @vote.save
        format.html { redirect_to @entry }
        format.js
      end
    end
  end

我有两个问题

  1. 如何在不使用隐藏字段的情况下指定current_user.id

  2. 此外,我现在没有在投票模型上使用attr_accessibleattr_protected。我该如何保护模型以确保某人无法创造大量选票?现在,投票模型中的所有字段都由params哈希设置 - 我应该使用attr_protectedentry_id外键,然后在控制器中单独设置它?

1 个答案:

答案 0 :(得分:2)

  

我没有使用attr_accessible   或者在投票模型上使用attr_protected   现在......

然后,根据定义,可以从查询字符串中进行质量分配。

  

我应该使用attr_protected吗,   entry_id外键然后设置   它分别在控制器中?

通常,使用attr_accessible比使用attr_protected更好。这是因为attr_accessible建立了deny-all默认的质量分配,并允许您定义列入白名单的例外。另一方面,attr_protected强制您将特定属性列入黑名单。当您修改程序并使用attr_accessible set添加新属性时,如果您需要将属性列入白名单并忘记,程序将失败。换句话说,它安全失败。或者,如果使用attr_protected set添加新属性,即使新属性应包含在黑名单中,该程序仍将工作。换句话说,它不安全地失败了。

这里的规则是保护允许从查询字符串设置的任何属性。保护密钥有助于防止注入新行,但如果您想要阻止更改现有行的内容,则可能需要保护其他字段。

可以在guides.rubyonrails.org找到关于此的一个很好的参考。