Ruby on rails 通过删除受保护的参数实现冗余安全性?

Ruby on rails 通过删除受保护的参数实现冗余安全性?,ruby-on-rails,security,Ruby On Rails,Security,在Rails 3中,我们可以定义可访问属性: attr_accessible :rating, :review 在这个模型中,有额外的用户id,它受到保护以防止伪造/黑客攻击。此值在控制器中指定: @review.user_id = current_user.id 如果我使用Firebug手动包含用户id,它将是参数[:review]的一部分,但当然,由于用户id未在属性访问中定义,因此它不会保存到数据库中。这种情况比较安全 问题1 我在Rails 3 in Action书中读到了,包括了Y

在Rails 3中,我们可以定义可访问属性:

attr_accessible :rating, :review
在这个模型中,有额外的
用户id
,它受到保护以防止伪造/黑客攻击。此值在控制器中指定:

@review.user_id = current_user.id
如果我使用Firebug手动包含
用户id
,它将是
参数[:review]
的一部分,但当然,由于
用户id
未在
属性访问中定义,因此它不会保存到数据库中。这种情况比较安全

问题1

我在Rails 3 in Action书中读到了,包括了Yehuda Katz
。删除
在执行进一步操作之前删除未经授权的参数的方法:
params[:review]。删除(:user_id)
。我应该包括这一点以进一步保护我的应用程序,还是忽略这一步

问题2

如果我应该包括上面的方法,我希望有类似于
.delete_all_,除了
的东西,只将其剥离到参数中允许的属性。我该怎么做


谢谢。

如果启用,Rails 3.2将在向模型发送额外质量分配参数时通过异常

config/application.rb

config.active_record.whitelist_attributes = true
与其删除您不想要的参数,我建议只接受您想要的参数:

@user.update_attributes params[:user].slice(:rating, :review)
这将只返回您允许的用户参数

注意:在Rails4(coming-soonish)中,此行为是通过名为的DSL实现的。您现在可以在Rails 3.2中安装此gem来实现:

@user.update_attributes params.require(:user).permit(:rating, :review)

因此,即使定义了
attr\u accessible
之后,仍然建议
slice
所需参数?如果希望发生异常,则不要对参数进行切片。