在控制器方法中,我有:
@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)
我理解最后一行不安全,需要强大的参数来防止质量分配(这意味着用户也可以为该用户设置任何其他db变量)。但是如何重构以使其安全(在这种情况下更一般)?
如果我是正确的,有两种方法: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
但这确实是安全的,因为它不是私人模型方法吗?
有人可以解释我对这两种方法的问题,也许可以解释哪种方法更受欢迎?
答案 0 :(得分:3)
强参数用于质量分配,即适用于此类情况
some_user.update_attributes(params[:user])
用户可能操纵表单以包含额外值。你所做的不是大规模任务,所以强大的参数并不重要。此外,强参数不会检查参数的内容(除了检查值是标量)。
您可能仍想检查用户是否可以将default_relationship_id
设置为该值,但您需要自己实施这些检查。您的两条建议都没有添加任何安全性(如果填充@rel
的查询只返回允许用户关联的对象,则可能没问题)