以下表达式在Rails中很常见:
@project = Project.find params[:id] # example 1
@project = current_user.projects.find params[:project_id] # example 2
但是我意识到find
也接受数组!这将意味着代码的意外和潜在危险行为,其假设@project
是单个项目而不是数组。
现在的问题是:
params[:id].to_s
使用时都会find
进行类型转换吗? find
使用强参数以避免数组吗? find params.permit(:id)[:id]
)? (如果您不想将to_s
转换为nil
,<优于""
)仅当路由未定义具有该名称的参数时,上述漏洞似乎才会出现。
例如:
# 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'