flawopen.com/Mass assignment/Explicado
Mass assignment: riesgos y listas seguras de campos
Imagina el modelo como un formulario con campos editables y controles reservados al personal. Vincular toda la solicitud permite al cliente rellenar también propiedad, aprobación o rol. Define los campos editables en el servidor y autoriza registro y operación por separado.
# 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())
# 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;
Por qué importan las listas permitidas en el servidor
Una lista de exclusión como «acepta todo salvo role» puede fallar cuando aparece un campo sensible nuevo. Con una lista permitida, el campo nuevo no se edita hasta que el código lo exponga. En Rails, Strong Parameters rechaza atributos no permitidos al asignar parámetros en masa; el controlador aún debe permitir solo los campos propios de la acción. DTO, serializador o formulario explícito crean el mismo límite.
La lista limita los atributos de la solicitud, pero no autoriza a modificar el registro. Limítalo al usuario autenticado, autoriza la operación y separa los cambios privilegiados en flujos del servidor.
Categorías de campos sensibles
Revisa los atributos del modelo, serializadores anidados y endpoints de actualización:
- ✓Propiedad y tenant — user_id, account_id, tenant_id. Aplica propiedad y autorización en el servidor; no confíes en el propietario enviado por el cliente.
- ✓Roles, permisos y estado — role, is_admin, email_verified, status. Cámbialos solo mediante un flujo autorizado del servidor.
- ✓Valores financieros y campos anidados/del sistema — saldos, descuentos, créditos, relaciones, marcas de tiempo e ID pueden afectar reglas o ampliar actualizaciones. Permite y valida cada campo.
Preguntas frecuentes
Son fallos distintos. Mass assignment establece atributos imprevistos en el objeto creado o actualizado. Prototype pollution cambia propiedades de un prototipo y puede afectar la búsqueda de otros objetos. Una combinación insegura puede abrir esa vía; el efecto de mass assignment depende del uso de esas propiedades. Consulta prototype pollution.
No. Una mutación puede aceptar una entrada demasiado amplia. Limita sus tipos a campos editables y autoriza objeto y operación en el resolver o servicio.
No. El formulario no limita lo que envía un cliente HTTP. Trata los campos como controlados por el atacante, valida la estructura en el servidor y acepta solo los previstos para la acción.