Ruby on rails 3 这容易受到大规模分配的影响吗?

Ruby on rails 3 这容易受到大规模分配的影响吗?,ruby-on-rails-3,security,mass-assignment,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 =>

我使用此选项允许用户对条目进行投票:

 <% 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 %>
我有两个问题

  • 如何在不使用隐藏字段的情况下分配
    当前用户.id

  • 另外,我现在没有在投票模型上使用
    attr\u accessible
    attr\u protected
    。我应该如何确保模型的安全性,以确保某人不能创造大量选票?现在,投票模型中的所有字段都由
    params
    散列设置——我是否应该使用
    attr\u protected
    比如
    entry\u id
    外键,然后在控制器中单独设置它

  • 我没有使用attr\u 或受投票模型保护的属性 现在

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

    我应该使用attr_保护,例如, 输入\u id外键,然后设置 它在控制器中是分开的吗

    一般来说,使用attr\u accessible比使用attr\u protected更好。这是因为attr_accessible建立了一个默认值deny all to mass assignment,并允许您定义白名单异常。另一方面,attr_protected强制您将特定属性列入黑名单。当您修改程序并添加设置了attr_accessible的新属性时,如果您需要将该属性列入白名单并忘记,程序将失败。换句话说,它会安全地失效。或者,如果添加设置了attr_protected的新属性,则即使该新属性本应包含在黑名单中,程序也会工作。换句话说,它不安全地失败了

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


    这方面的一个很好的参考可以在。

    构建投票时,为什么不将当前用户合并到参数中呢?此时用户的会话是否无效?否,但我不确定语法,因为我正在使用entry实例构建投票。因此,如果我仅将
    attr\u accessible
    添加到安全选项中(除了“entry\u id”…那么在控制器中,如何设置和保存“entry\u id”参数散列之外?上面链接的指南第6.1节显示了显式设置的属性。由于您不允许用户直接从散列设置属性,因此您可能会检查散列值,验证它,然后将验证值应用于属性。
    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