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)
这取决于。你的参数是怎么进来的?params[:id]你的和是params[:project_id]作为路由参数到达的吗?如果是这样,那么你就安全了。
否则你想使用强参数 - 这应该可以覆盖你。
最后,您可能想要使用#2,因为您不希望用户获得对他们不属于的项目的访问权限。
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |