Không thay được pentest, nhưng phần lớn lỗ hổng hay gặp nhất bắt được bằng test tự động thông thường.
1. Phân quyền theo từng đối tượng (quan trọng nhất). Lỗi phổ biến nhất trong API là kiểm tra "đã đăng nhập" nhưng quên kiểm tra "có sở hữu bản ghi này không". Với mỗi endpoint nhận id, viết test: user A gọi vào tài nguyên của user B phải nhận 403/404, không phải 200.
const res = await request(app)
.get(`/api/orders/${orderOfUserB.id}`)
.set('Authorization', tokenOfUserA)
expect(res.status).toBe(404)Dạng test này nên sinh theo bảng cho toàn bộ endpoint, vì bỏ sót một endpoint là đủ lộ dữ liệu.
2. Xác thực và phiên. Không có token → 401; token hết hạn, token bị sửa chữ ký, token của môi trường khác → 401. Sau khi đăng xuất hoặc đổi mật khẩu, token cũ không dùng được nữa.
3. Đầu vào không tin cậy. Field thừa trong body không được ghi thẳng vào DB (mass assignment: gửi kèm role: "admin"). Trường số nhận chuỗi, id nhận giá trị âm, mảng dài bất thường, payload vượt kích thước — phải trả 400, không phải 500.
4. Rò rỉ thông tin. Response lỗi không được chứa stack trace, câu SQL, tên bảng. Thông báo đăng nhập sai không được phân biệt "email không tồn tại" và "sai mật khẩu".
5. Tự động trong CI. Quét phụ thuộc có CVE ở mỗi PR, quét secret bị commit nhầm, bật rule bảo mật của linter. Đây là phần rẻ nhất và bắt được nhiều nhất.
Cách trả lời tốt: nêu rõ những gì test tự động không bắt được — lỗi logic nghiệp vụ nhiều bước, race condition khi thanh toán, cấu hình hạ tầng — và đó là lý do vẫn cần pentest định kỳ.