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 becomes part of the SQL code
db.query("SELECT * FROM users WHERE name = '" + input + "'")
// GOOD — parameterized: input is always treated as 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ố hóa đượ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ố hóa sẵn.