1. 10:48 23/08/2026
Trong nhiều ứng dụng web, dữ liệu người dùng nhập vào đi qua nhiều lớp: biểu mẫu trên giao diện, API, logic nghiệp vụ và cơ sở dữ liệu. Một lỗi phổ biến là chỉ kiểm tra ở frontend rồi cho rằng dữ liệu đã an toàn. Cách làm này vừa dễ bị bỏ qua khi gọi API trực tiếp, vừa khiến hệ thống khó bảo trì khi có thêm ứng dụng di động hoặc dịch vụ tích hợp.
Nguyên tắc quan trọng là: frontend kiểm tra để cải thiện trải nghiệm, còn backend phải kiểm tra để bảo vệ hệ thống. Ví dụ, một biểu mẫu đăng ký có thể yêu cầu email hợp lệ và mật khẩu đủ dài trên trình duyệt. Tuy nhiên, API vẫn phải tự xác thực các điều kiện đó, vì bất kỳ ai cũng có thể gửi request bằng công cụ khác.
1. Phân biệt validation và sanitization
Validation trả lời câu hỏi dữ liệu có đúng quy tắc hay không. Chẳng hạn, trường số lượng phải là số nguyên dương, ngày kết thúc không được trước ngày bắt đầu, hoặc mã sản phẩm phải thuộc danh sách cho phép.
Sanitization là quá trình chuẩn hóa hoặc loại bỏ phần không cần thiết, chẳng hạn cắt khoảng trắng thừa, chuẩn hóa email về chữ thường hoặc chuyển đổi kiểu dữ liệu. Không nên dùng sanitization để che giấu dữ liệu sai; dữ liệu vi phạm quy tắc nghiệp vụ vẫn cần bị từ chối với thông báo rõ ràng.
2. Kiểm tra theo ngữ cảnh sử dụng
Không có một cách “lọc chuỗi” áp dụng cho mọi nơi. Dữ liệu hiển thị trong HTML cần được encode phù hợp với HTML; dữ liệu đưa vào câu lệnh SQL cần dùng prepared statement hoặc query có tham số; dữ liệu dùng trong URL cần được encode theo ngữ cảnh URL. Việc tự nối chuỗi để tạo SQL hoặc HTML có thể mở ra lỗ hổng injection và Cross-Site Scripting.
3. Dùng schema chung cho API
Với các API có nhiều endpoint, nên mô tả rõ kiểu dữ liệu, trường bắt buộc, giới hạn độ dài và định dạng. Schema giúp frontend, backend và tài liệu API thống nhất hơn. Khi dữ liệu không hợp lệ, API nên trả mã trạng thái phù hợp cùng thông tin lỗi đủ dùng, nhưng không tiết lộ stack trace, câu lệnh cơ sở dữ liệu hay thông tin nội bộ.
4. Kiểm tra cả giới hạn kích thước
Một request hợp lệ về mặt định dạng vẫn có thể gây quá tải nếu chứa chuỗi quá dài, quá nhiều phần tử trong mảng hoặc tệp vượt giới hạn. Hãy đặt giới hạn cho body request, số lượng bản ghi phân trang, độ dài trường văn bản và kích thước file. Các giới hạn này nên được ghi rõ trong tài liệu để người dùng API biết cách xử lý.
5. Kiểm thử các trường hợp xấu
Bên cạnh dữ liệu hợp lệ, hãy kiểm thử chuỗi rỗng, giá trị null, kiểu dữ liệu sai, ký tự Unicode, số âm, giá trị cực lớn và request thiếu trường. Với các luồng quan trọng như thanh toán, phân quyền hoặc thay đổi thông tin tài khoản, nên bổ sung kiểm thử tích hợp để chắc chắn rằng dữ liệu không hợp lệ bị chặn ở backend.
Cuối cùng, validation không thay thế cho phân quyền, mã hóa hay prepared statement. Đây là một lớp phòng vệ trong thiết kế nhiều lớp. Khi quy tắc được đặt gần nơi xử lý nghiệp vụ, lỗi được ghi nhận có kiểm soát và kiểm thử được tự động hóa, ứng dụng sẽ an toàn hơn mà vẫn dễ phát triển về sau.