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

时间:2016-09-01 10:14:24

标签: ruby-on-rails security ruby-on-rails-4 rails-activerecord

以下表达式在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'

0 个答案:

没有答案