强大的参数和安全性
Strong params and security
在控制器方法中我有:
@user = current_user
@rel = Relationship.where('user_id = ? and organization_id = ? and fish = ?', @user.id, params[:user][:default_relationship_id], true).first
@user.update_attributes(default_relationship_id: @rel.id)
我知道最后一行不安全并且需要强大的参数来防止批量分配(这意味着用户也可以为该用户设置任何其他数据库变量)。但是如何重构以使其安全(在这种情况下更一般)?
如果我是对的,有两种方法:1) 用强参数替换它,或 2) 使用模型方法。
广告 1) 强参数:
@user.update_attributes(update_params)
private
def update_params
params.require(:user).permit(:default_relationship_id)
end
但这怎么知道将 default_relationship_id
设置为 @rel.id
?
广告2)将其添加到模型方法中:
@user.update_default(@rel.id) # In controller
def update_default(value) # In model file
self.update_attributes(default_relationship_id: value)
end
但这真的安全吗,因为它不是私有模型方法?
有人可以解释一下我对这两种方法中的每一种都有的问题,并解释一下哪种方法更可取吗?
strong params 用于批量分配,即它适用于这种情况
some_user.update_attributes(params[:user])
用户可能操纵表单以包含额外值的位置。您正在做的不是批量分配,因此强参数无关紧要。此外,strong params 不检查参数的内容(检查值是否为标量除外)。
您可能仍想检查用户是否可以将 default_relationship_id
设置为该值,但您需要自己实施这些检查。您的 2 个建议都没有增加任何安全性(如果填充 @rel
的查询将仅 return 允许用户关联的对象,这可能没问题)
在控制器方法中我有:
@user = current_user
@rel = Relationship.where('user_id = ? and organization_id = ? and fish = ?', @user.id, params[:user][:default_relationship_id], true).first
@user.update_attributes(default_relationship_id: @rel.id)
我知道最后一行不安全并且需要强大的参数来防止批量分配(这意味着用户也可以为该用户设置任何其他数据库变量)。但是如何重构以使其安全(在这种情况下更一般)?
如果我是对的,有两种方法:1) 用强参数替换它,或 2) 使用模型方法。
广告 1) 强参数:
@user.update_attributes(update_params)
private
def update_params
params.require(:user).permit(:default_relationship_id)
end
但这怎么知道将 default_relationship_id
设置为 @rel.id
?
广告2)将其添加到模型方法中:
@user.update_default(@rel.id) # In controller
def update_default(value) # In model file
self.update_attributes(default_relationship_id: value)
end
但这真的安全吗,因为它不是私有模型方法?
有人可以解释一下我对这两种方法中的每一种都有的问题,并解释一下哪种方法更可取吗?
strong params 用于批量分配,即它适用于这种情况
some_user.update_attributes(params[:user])
用户可能操纵表单以包含额外值的位置。您正在做的不是批量分配,因此强参数无关紧要。此外,strong params 不检查参数的内容(检查值是否为标量除外)。
您可能仍想检查用户是否可以将 default_relationship_id
设置为该值,但您需要自己实施这些检查。您的 2 个建议都没有增加任何安全性(如果填充 @rel
的查询将仅 return 允许用户关联的对象,这可能没问题)