flawopen.com/Mass Assignment/说明
Mass Assignment:风险与安全字段白名单
CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes参考页面
简答
把模型想成一张表单:有用户可编辑字段,也有员工专用控制项。绑定整个请求体,就等于让客户填写账户归属、审批状态或角色。应在服务器定义字段,并分别授权记录和操作。
VULNERABLE
# Rails: request keys reach model attributes User.new(params[:user]) // Node / Mongoose: request object used as update await User.findByIdAndUpdate(id, req.body); // Express + Sequelize: request object used as create values await User.create(req.body); # Django: request keys passed as model fields User.objects.create(**request.POST.dict())
FIXED
# Rails — permit only user-editable fields attrs = params.require(:user).permit(:name, :email) user = User.new(attrs) // Node — construct an allowlisted update const { name, email } = req.body; await User.findByIdAndUpdate(id, { name, email }); # Django — explicit ModelForm fields class UserForm(ModelForm): class Meta: model = User fields = ["name", "email"] // .NET — bind a DTO, then map explicitly user.Name = input.Name; user.Email = input.Email;
为什么服务器端字段白名单很重要
“除 role 外全部接受”的黑名单可能漏掉后来新增的敏感字段。白名单让新字段默认不可编辑,直到代码明确开放。Rails Strong Parameters 在批量赋值时拒绝未许可属性;控制器仍须只许可当前操作所需字段。DTO或显式字段列表也能建立此边界。
白名单限制请求可设置的属性,但不授予修改记录的权限。将记录限定在已认证主体范围内,单独授权操作,并把特权修改放入独立服务端流程。
需检查的敏感字段类别
检查模型属性、嵌套序列化器和更新接口中的以下类别:
- ✓所有权和租户键 — user_id、account_id、tenant_id。在服务端验证归属,不要信任客户端提供的所有者。
- ✓角色、权限和工作流状态 — role、is_admin、email_verified、status。只能通过经过授权的服务端流程修改。
- ✓财务值及嵌套/系统字段 — 余额、折扣、额度、关联、时间戳和 ID 可能影响业务规则或扩大更新范围。逐项明确许可并验证。
常见问题
这与 prototype pollution 是一回事吗?
这是不同的弱点。Mass Assignment会让输入设置对象的非预期属性。Prototype pollution修改对象原型属性,可能影响其他对象的属性查找。不安全合并可能导致后者;是否形成Mass Assignment取决于应用如何使用属性。参见prototype pollution。
GraphQL 能避免这个问题吗?
不能。GraphQL mutation也可能接受过宽的输入。输入类型仅包含客户端可改字段,并在resolver或服务层授权对象和操作。
服务端渲染表单能保护我吗?
不能。表单不能限制HTTP客户端发送内容。将字段视为攻击者可控,在服务器验证结构,只接受当前操作允许的字段。