Trong lập trình, có một câu nói nghe tưởng như hiển nhiên nhưng lại bị bỏ qua nhiều nhất:
“Never trust user input.”
Vấn đề là: rất nhiều hệ thống nói vậy, nhưng lại không làm vậy.
1. User input không chỉ là form và textbox
Khi nghe “user input”, nhiều người chỉ nghĩ đến:
- Form đăng nhập
- Ô search
- Comment box
- HTTP headers
- Cookie, JWT
- Query parameter, JSON body
- File upload
- API request
- Thậm chí dữ liệu đến từ service khác
2. “Người dùng hợp lệ” không đồng nghĩa với “dữ liệu an toàn”
Một sai lầm nguy hiểm là:
“User này đã đăng nhập rồi, chắc không sao.”
Nhưng thực tế:
- Tài khoản có thể bị chiếm
- Token có thể bị đánh cắp
- Request có thể bị chỉnh sửa
- Client không bao giờ đáng tin
Hệ thống không bị tấn công vì tin hacker, mà vì tin người dùng quá sớm.
3. User input là điểm bắt đầu của hầu hết lỗ hổng
Phần lớn các lỗ hổng nghiêm trọng đều bắt đầu từ việc xử lý input sai:
- SQL Injection
- Command Injection
- XSS
- Path Traversal
- Deserialization lỗi
Điểm chung không phải là kỹ thuật phức tạp,
mà là giả định rằng dữ liệu “đến đúng”.
Không có input “vô hại” – chỉ có input chưa được kiểm tra đủ kỹ.
4. Không tin user input không có nghĩa là từ chối user
“Không tin” không có nghĩa là:
- Chặn mọi request
- Làm hệ thống khó dùng
Mà là:
- Validate dữ liệu
- Sanitize đúng chỗ
- Encode khi output
- Kiểm tra logic, không chỉ định dạng
5. Bảo mật bắt đầu từ giả định xấu nhất
Hệ thống an toàn không phải vì:
- User tốt
- Code sạch
- Input “trông có vẻ hợp lệ”
Mọi input đều được coi là nguy hiểm cho đến khi chứng minh được điều ngược lại.
Giả định xấu không làm bạn bi quan, nó làm hệ thống vững hơn trước thực tế.