在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中允许的属性。我该怎么做?
感谢。
答案 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)