我想开始在我的模型中使用attr_accessible来解决质量分配问题。我理解它是如何工作的,并尽可能多地进行研究。
我不明白的是使用update_attributes(params [:my_form])或create(params [:my_form])和逐个设置字段之间的区别?这两个都不是那么脆弱吗?
没有attr_accessible和这样做有什么区别...
@model_object = ModelObject.new
@model_object.create(params[:model_object_params])
并且有attr_accessible并且这样做......
@model_object = ModelObject.new
@model_object.field1 = params[:model_object_params][:field1]
@model_object.field2 = params[:model_object_params][:field2]
@model_object.field3 = params[:model_object_params][:field3]
@model_object.save!
这些创建记录的方法是否同样容易受到攻击?黑客/黑客可以向这两种方法发送网址,两者都会做同样的,对吗?
或者使用attr_accessible并逐个更新字段做一些不同的事情或以某种方式变得更安全?
我发现使用attr_accessible的所有这些方法都没有任何意义。它似乎以两种不同的方式做同样的事情。我错过了什么?
感谢。
答案 0 :(得分:7)
在你这样做的过程中,它并不能阻止“质量分配”。
“质量分配”是Rails处理为模型中的属性赋值的过程中使用的术语。这通常使用params
中的名称和值在控制器中完成。
当你自己进行分配时,它在某种程度上也是“大规模分配”;但在这种情况下,你可以很好地控制要分配的内容和不分配的内容。因此,为了节省编写样板分配代码,Rails提供attr_accesible
- 相同的控制,更少的代码。
要查看其使用方式:
假设ActivityLog
模型具有名为user_ip_address
的属性。
现在,user_ip_address
是模型中的一个属性,可以通过质量分配或“自动批量分配”来分配。
但是在两种情况下都是错误的 - 您不希望用户提供的输入为该属性设置值。
相反,您希望始终找出用户的实际IP地址并分配该值(忽略任何值)
params
)中的值。因此,您可以从user_ip_address
中排除attr_accessible
,而是自行分配。
attr_accessible :all_attributes_except_user_ip_address
@al = ActivityLog.new(params[:model_object_params])
@al.user_ip_address = get_origin_user_ip_address
@al.save
对于用户无法更改的任何信息,请使用attr_accessible
并将其从列表中排除。
答案 1 :(得分:3)
简短的回答是它会隐式设置field4
。
不同之处在于,如果没有attr_accessible
,黑客可能会更新不在您表单中的字段。 attr_accessible
这是不可能的。
E.g。如果您的用户模型有一个字段is_admin
,黑客可以尝试通过发布来创建一个新的管理员:
params[:user][:is_admin] = true
如果设置attr_accessible
(显然它不应包含is_admin
),这是不可能的。
关于您的示例:如果您的模型只有field1
,field2
和field3
,并且您没有其他要保护的数据库列,则无需使用{{1 }}。希望这说清楚。
请记住:
没有任何预防措施 Model.new(params [:model])允许 攻击者设置任何数据库列 值。
来源:http://guides.rubyonrails.org/security.html#mass-assignment
答案 2 :(得分:2)
这里的想法是限制您为给定模型接受的参数。然后,您可以使用验证或其他代码测试每个代码,以确保它们符合预期值。
Attr_accessible旨在将模型的“表面”限制为您要接受的内容并仔细检查。通过这种方式,您可以自动忽略注入的参数,例如:roles =>如果您将该功能添加到模型中,请使用“admin”
user.update_attributes(params[:user])
由于角色属性未在attr_accessible中列出,因此用户尝试成为管理员是徒劳的。
您希望在一个位置(您的模型)处理验证逻辑,而不是检查控制器中的每个参数值。
答案 3 :(得分:2)
批量作业不是你预防的东西,而是你控制的东西。这是一个很好的功能,可以使事情变得更简单,更清晰,但是如果没有某种能力来控制通过质量分配设置的内容,那么它就是一个潜在的安全漏洞。正如其他人所提到的那样,attr_accessible
提供了控制权。