Model binder không biết trường nào là bí mật
IDOR là đọc sai bản ghi. Mass assignment là ghi sai trường — và nó cùng một gốc: server tin một thứ do client gửi mà không hỏi client có quyền đặt thứ đó hay không.
Cơ chế đơn giản đến mức khó tin: bạn khai một action nhận User và ASP.NET Core làm đúng việc nó được thiết kế để làm — gán mọi trường trong JSON vào mọi property khớp tên. Nó không có cách nào biết Role khác DisplayName về mức nghiêm trọng. Với nó cả hai chỉ là hai string.
Kết quả là một lớp lỗi có hình dạng rất đặc trưng: request hợp lệ, không có payload gì lạ, và một trường thừa.
PATCH /api/users/meContent-Type: application/json { "displayName": "Thong", "role": "Admin" }API3 gọi tên đầy đủ của nó là Broken Object Property Level Authorization, và cái tên dài đó nói đúng điều cần nói: phân quyền không chỉ ở mức đối tượng mà còn ở mức từng property. Cùng một người dùng, cùng một bản ghi, và vẫn có trường họ đọc được nhưng không được ghi.
Hai hướng, và cả hai đều là API3:
| Hướng | Tên | Ví dụ |
|---|---|---|
| Ghi trường không được phép | Mass assignment | {"role":"Admin"}, {"isVerified":true}, {"balance":9999} |
| Đọc trường không được phép | Excessive data exposure | Trả cả passwordHash, internalNotes, stripeCustomerId vì DTO trả thẳng entity |
Hướng thứ hai đáng chú ý vì nó âm thầm hơn: không ai báo lỗi, response vẫn 200, và dữ liệu thừa nằm trong JSON mà giao diện không hiển thị — nên không ai thấy, trừ người mở DevTools.
Bình luận
Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.
Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.
Đang tải bình luận…