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

col*_*rco 5 security ruby-on-rails ruby-on-rails-4 rails-activerecord

以下表达式在Rails中很常见:

@project = Project.find params[:id] # example 1

@project = current_user.projects.find params[:project_id] # example 2
Run Code Online (Sandbox Code Playgroud)

但是我意识到它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]
Run Code Online (Sandbox Code Playgroud)

查询/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'
Run Code Online (Sandbox Code Playgroud)

kwe*_*rle 0

这取决于。你的参数是怎么进来的?params[:id]你的和是params[:project_id]作为路由参数到达的吗?如果是这样,那么你就安全了。

否则你想使用强参数 - 这应该可以覆盖你。

最后,您可能想要使用#2,因为您不希望用户获得对他们不属于的项目的访问权限。