在Rails中使用find params[:id]安全吗?



下列表达式在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,因为您不希望用户访问他们不属于的项目。

最新更新