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

时间:2012-09-18 15:14:55

标签: ruby-on-rails security

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

attr_accessible :rating, :review

在此模型中,还有其他user_id受到保护以防止伪造/黑客攻击。该值在控制器中分配:

@review.user_id = current_user.id

如果我使用Firebug手动添加user_id,它将成为params[:review]的一部分,但当然user_id未定义attr_accessible,不会被保存到数据库中。这种情况相当安全。

问题1

我在 Rails 3 In Action 一书中读到,Yehuda Katz在执行进一步操作之前使用.delete方法删除了未经授权的参数:params[:review].delete(:user_id)。我是否应该将其包括在内以进一步保护我的应用程序,或者忽略此步骤?

问题2

如果我应该包含上面的方法,我希望像.delete_all_except这样的东西将它剥离到params中允许的属性。我该怎么做?

感谢。

1 个答案:

答案 0 :(得分:1)

如果启用,如果将额外的质量分配参数发送到模型

,Rails 3.2将通过例外

配置/ application.rb中

config.active_record.whitelist_attributes = true

我建议只接受您想要的参数,而不是删除您不想要的参数:

@user.update_attributes params[:user].slice(:rating, :review)

这只会返回您允许的用户参数。

注意:在Rails 4(即将发布)中,此行为是使用名为strong-parameters的DSL实现的。您可以在Rails 3.2中安装此gem以立即实现:

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