Rails 安全:完全避免大规模分配
我的生产代码中往往不需要 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 是“未保存”属性。
I tend to not need the mass-assignment feature in my production code. (In my test code, I use it a lot, but in those cases I do want to set arbitrary columns.)
So if, in my production code, I simply avoid these forms:
Article.new(params[:article]) # or create
article.attributes = params[:article]
article.update_attributes(params[:article])
and instead always manually enumerate all the attributes, like so:
Article.new(:title => params[:article][:title], :body => params[:article][:body], ...)
am I save from mass assignment security issues (even without using attr_accessible
/attr_protected
)?
Edit: The reason I'm not just disabling mass assignment is, I'd like to be able to write Article.create!(:blog_id => @blog.id, ...)
, where blog_id is an "unsave" attribute.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是的,使用第二种方法,您可以避免用户分配给其他属性。
不过,这是一种比较干燥的写法:
-或者-
Yes, using the 2nd method, you're safe from users assigning to other attributes.
This is a DRYer way to write it, though:
-or-
将其添加到
config/environments/Production.rb
的末尾:Add this at the end of
config/environments/production.rb
:我无法让 John Douthat 的方法适用于多个参数,因此我想出了以下替代方案(取自我的 CommentsController):
I could not get John Douthat's method working for multiple parameters, so I came up with the following alternative (taken from my CommentsController):