强大的参数

Strong parameters

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

现在要创建一个新的 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 作为隐藏字段传递。我是否应该竭尽全力才能使用强大的参数?

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

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,您实际上也是在手动为每个属性分配一个参数。