我倾向于在我的生产代码中不需要 mass-assignment 功能。 (在我的测试代码中,我经常使用它,但在这些情况下,我确实想设置任意列。)

因此,如果在我的生产代码中,我只是避免使用这些形式:

Article.new(params[:article])  # or create
article.attributes = params[:article]
article.update_attributes(params[:article])

而是始终手动枚举所有属性,如下所示:
Article.new(:title => params[:article][:title], :body => params[:article][:body], ...)

我是否可以避免批量分配安全问题(即使不使用 attr_accessible/attr_protected )?

编辑: 我不只是禁用批量分配的原因是,我希望能够编写 Article.create!(:blog_id => @blog.id, ...) ,其中 blog_id 是“未保存”属性。

最佳答案

是的,使用第二种方法,您可以避免分配给其他属性的用户。

不过,这是一种 DRYer 的编写方式:

Article.new(params[:article].slice(:title, :body))

-或者-
def article_params
  params[:article].slice(:title, :body)
end

Article.new(article_params)  # or create
article.attributes = article_params
article.update_attributes(article_params)

关于ruby-on-rails - Rails 安全 : Avoiding mass-assignment altogether,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5424430/

10-10 14:54