【问题标题】:Strong parameters强大的参数
【发布时间】:2015-06-24 08:38:56
【问题描述】:

我的网址看起来像这样username/project/project_members 用户有很多项目,用户和项目之间也通过项目成员建立了丰富的多对多关系。可以把它想象成 github,一个用户有很多 repo,而一个 repo 有很多合作者作为用户。

现在要创建一个新的 ProjectMember 对象,我可以进行批量分配:

ProjectMember.create(user_id: params[:user_id], project_id: @project.id, role: params[:project_member][:role])

或者我可以这样做:

@project.members << @member
@project.member_project(role: params[:project_member][:role])

如您所知,在这两种情况下,我都需要先找到@project 和@member 对象。要找到@member,我已经将 user_id 作为隐藏文件传递,我用我的 url 找到了@project(见顶部)。我的表格如下:

- @users.each do |user|
  = form_tag user_project_project_members_add_path(@project.user, @project) do
     = label_tag 'username', user.username
     = hidden_field_tag "user_id", user.id
     = select('project_member', 'role', roles)
     = submit_tag 'Add', :name => nil

这种代码使强参数毫无用处。即我没有使用它来制作我的新 project_member 实例。 我应该担心我没有使用强参数吗?我想其中一个技巧可能是我也将 project_id 作为隐藏字段传递。我应该向后弯腰以便使用强大的参数吗?

【问题讨论】:

    标签: ruby-on-rails has-many-through strong-parameters


    【解决方案1】:

    导致漏洞的批量分配是在您执行以下操作时:

    User.create(params[:user]) 
    

    然后恶意用户会通过{ user: { name: 'Haxxor', admin: true }} 并且您的整个应用程序都会受到损害。

    在 Rails 4 之前,Rails 很乐意让您这样做。

    这样做并没有真正的危险:

    ProjectMember.create(
      user_id: params[:user_id], 
      project_id: @project.id, 
      role: params[:project_member][:role]
    )
    

    即使您使用哈希创建 ProjectMember,您实际上也是在手动为每个属性分配一个参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多