下列表达式在Rails中很常见:
@project = Project.find params[:id] # example 1
@project = current_user.projects.find params[:project_id] # example 2
然而,我意识到find
也接受数组!这将意味着代码的意外和潜在的危险行为,这是在假设@project
是一个单独的项目,而不是一个数组的情况下编写的。
现在的问题是:
- 每次我在
find
中使用params[:id].to_s
时都应该转换类型吗? - 我应该使用
find
强参数,以避免数组?find params.permit(:id)[:id]
) ?(如果您不想将nil
转换为""
,则优于to_s
) - 是否有其他替代方案或常见做法?
上述漏洞似乎只有在路由没有定义具有该名称的参数时才存在。例如: 查询 此外,以下内容根本不等效,并且会在控制器中创建漏洞:# SAFE routes.rb
resources :projects
# projects_controller.rb
Project.find params[:id]
/projects/3?id[]=4&id[]=5
只产生{id: 3}
作为参数。这将使使用Project.find params[:id]
安全:然而,我找不到任何关于此行为和的文档,我不知道依赖它是否安全:也许它只是偶然的。# Likely UNSAFE routes.rb
# E.g.:
# /projects?id=3 => params = {id: 3}
# /projects?id[]=3&id[]=4 => params = {id: [3, 4]}
put '/projects' => 'projects#update'
看情况。你的参数怎么样了?您的params[:id]
和params[:project_id]
是否作为路由参数到达?如果是这样,那你就安全了。
否则你想使用强参数——它应该覆盖你。
最后,您可能希望使用#2,因为您不希望用户访问他们不属于的项目。