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