【问题标题】:Is this vulnerable to mass assignment?这是否容易受到批量分配的影响?
【发布时间】:2011-02-01 04:14:48
【问题描述】:

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

 <% 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。我应该如何保护模型以确保有人不能创造很多选票?现在,Vote 模型中的所有字段都由 params 哈希设置——我应该使用 attr_protected 上的 entry_id 外键,然后在控制器中单独设置它吗?

    李>

【问题讨论】:

  • 在构建投票时为什么不将 current_user 合并到参数中?此时用户的会话是否无效?
  • 不,但我不确定语法,因为我正在使用条目实例构建投票。

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


【解决方案1】:

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

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

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

一般来说,使用 attr_accessible 比使用 attr_protected 更好。这是因为 attr_accessible 为批量分配建立了默认拒绝全部并允许您定义列入白名单的异常。另一方面, attr_protected 强制您将特定属性列入黑名单。当您修改程序并添加设置了 attr_accessible 的新属性时,如果您需要将该属性列入白名单并忘记,程序将失败。换句话说,它安全地失败了。或者,如果您添加一个设置了 attr_protected 的新属性,程序将运行即使新属性应该已包含在黑名单中。换句话说,它不安全地失败了。

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

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

【讨论】:

  • 所以,如果我只将attr_accessible 添加到安全选项中(除了“entry_id”之外的所有选项......然后在控制器中,我如何设置和保存外部的“entry_id”参数哈希?
  • 上面链接的指南的第 6.1 节显示了明确设置的属性。由于您不允许用户直接从哈希中设置属性,因此您可能会检查哈希值,对其进行验证,然后将验证后的值应用于属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
相关资源
最近更新 更多