我的模型Secret
有3个字段:f1
,f2
和f3
。
我有表单,用户只能输入 <{strong> f1
和f2
。 不是f3
。
将值传递给新对象的最佳方法是什么?
如果我要写@secret = Secret.new(params[:secret])
,恶意用户可以将f3
传递给我的模型,它将保存在模型中。
阻止用户传递额外值的最佳方法是什么?
我读过http://guides.rubyonrails.org/security.html#mass-assignment并且有3种变体:
1)黑名单(attr_protected :f3
)
2)白名单(attr_accessible :f1, :f2
)
3)全局白名单(按配置行attr_accessible
强制config.active_record.whitelist_attributes = true
)
哪种方法最好?
答案 0 :(得分:2)
最偏执(因此也是最好)的设置是attr_accessible :f1, :f2
与config.active_record.whitelist_attributes = true
相结合。
如果稍后添加任何新属性(通过添加迁移),则必须激活启用批量对齐的新属性。如果您只是将禁用列表黑名单,您可能会忘记将新属性添加到黑名单中。如果您使用白名单,则不会发生这种情况。