flawopen.com/Mass Assignment/Penjelasan
Mass Assignment: risiko dan allowlist field yang aman
Bayangkan model sebagai formulir dengan field pengguna dan kontrol khusus staf. Mengikat seluruh permintaan membiarkan pelanggan mengisi pemilik akun, persetujuan, atau peran. Tentukan field yang dapat diedit di server, lalu otorisasi record dan operasi secara terpisah.
# 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;
Mengapa allowlist sisi server penting
Daftar blokir “terima semua kecuali role” dapat gagal saat field sensitif baru muncul. Dengan allowlist, field baru tidak dapat diedit sampai diizinkan kode. Rails Strong Parameters menolak atribut yang tidak diizinkan saat mass assignment; controller tetap harus membatasi field untuk tindakan itu. DTO atau daftar eksplisit memberikan batas serupa.
Allowlist membatasi atribut yang dapat ditetapkan permintaan, bukan izin mengubah record. Batasi record pada principal terautentikasi, otorisasi operasi, dan pisahkan perubahan istimewa ke alur server.
Kategori field sensitif
Periksa atribut model, serializer bertingkat, dan endpoint pembaruan:
- ✓Kunci kepemilikan dan tenant — user_id, account_id, tenant_id. Tegakkan kepemilikan di server; jangan percaya pemilik dari klien.
- ✓Peran, izin, dan status alur — role, is_admin, email_verified, status. Ubah hanya melalui alur server terotorisasi.
- ✓Nilai keuangan dan field bertingkat/sistem — saldo, diskon, kredit, relasi, timestamp, ID dapat memengaruhi aturan atau cakupan pembaruan. Izinkan dan validasi tiap field dengan sengaja.
Pertanyaan umum
Ini kelemahan berbeda. Mass assignment menetapkan atribut tak dimaksud pada objek yang dibuat atau diperbarui. Prototype pollution mengubah properti prototipe dan dapat memengaruhi pencarian properti objek lain. Penggabungan tak aman dapat membuka jalur itu; dampak mass assignment bergantung pada penggunaan propertinya. Lihat prototype pollution.
Tidak. Mutasi GraphQL dapat menerima input terlalu luas. Batasi tipe input ke field yang boleh diubah klien dan otorisasi objek serta operasi di resolver atau layanan.
Tidak. Formulir tidak membatasi klien HTTP. Anggap semua field dikendalikan penyerang, validasi struktur di server, dan terima hanya field untuk tindakan itu.