SQL injection xảy ra khi app ghép chuỗi input người dùng vào câu SQL → kẻ tấn công chèn lệnh SQL để lộ/sửa dữ liệu, thậm chí chiếm DB.
js
// BAD — input trở thành một phần code SQL
db.query("SELECT * FROM users WHERE name = '" + input + "'")
// GOOD — parameterized: input luôn được coi là data
db.query('SELECT * FROM users WHERE name = ?', [input])Phòng chống (theo thứ tự hiệu quả — OWASP):
1. Prepared statement / parameterized query — tách code SQL khỏi dữ liệu; input luôn được coi là giá trị, không bao giờ là lệnh. Đây là biện pháp chính.
2. Stored procedure viết an toàn (không tự ghép SQL động bên trong).
3. Allow-list cho phần không tham số hoá được (tên bảng/cột, chiều sort).
4. Least privilege cho tài khoản DB; validate input là lớp phụ.
Tránh escape thủ công làm biện pháp chính — mong manh. ORM dùng đúng cũng tham số hoá sẵn.