Rails安全性:完全避免批量分配

Jo *_*iss 3 security activerecord ruby-on-rails

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

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

Article.new(params[:article])  # or create
article.attributes = params[:article]
article.update_attributes(params[:article])
Run Code Online (Sandbox Code Playgroud)

而是始终手动枚举所有属性,如下所示:

Article.new(:title => params[:article][:title], :body => params[:article][:body], ...)
Run Code Online (Sandbox Code Playgroud)

我是否从质量分配安全问题中解脱出来(即使不使用attr_accessible/ attr_protected)?

编辑:我不只是禁用批量分配的原因是,我希望能够写Article.create!(:blog_id => @blog.id, ...),其中blog_id是一个"unsave"属性.

Joh*_*hat 10

是的,使用第二种方法,您可以安全地从用户分配其他属性.

这是一种干燥的写作方式,但是:

Article.new(params[:article].slice(:title, :body))
Run Code Online (Sandbox Code Playgroud)

-要么-

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

Article.new(article_params)  # or create
article.attributes = article_params
article.update_attributes(article_params)
Run Code Online (Sandbox Code Playgroud)