参数很强

时间:2015-06-24 08:38:57

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

我的网址看起来像这样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作为隐藏文件传递,我发现@project和我的url(参见顶部)。我的表格如下:

- @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作为隐藏字段传递。我是否应该向后弯腰才能使用强力的参数?

1 个答案:

答案 0 :(得分:0)

导致漏洞的那种质量分配就是在你做的时候:

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