SQL Injection là tấn công chèn SQL qua user input để thao túng query — bypass đăng nhập, trích xuất hoặc xóa dữ liệu.
- Ví dụ kinh điển — username
' OR '1'='1' --biến query thànhSELECT * FROM users WHERE username = '' OR '1'='1' --...— luôn true, vượt qua login. - Second-order injection — input được lưu vào DB rồi dùng trong query khác không qua kiểm soát — khó phát hiện hơn.
- Phòng chống chính: parameterized query —
db.query('SELECT * FROM users WHERE id = $1', [userId]): user input không bao giờ được diễn giải thành SQL. - ORM — Prisma/Sequelize/TypeORM tự parameterize; raw query vẫn rủi ro:
prisma.$queryRawvới tagged template an toàn,$queryRawUnsafe('...' + userId)thì không. - Defense in depth — input validation bổ trợ nhưng không thay được parameterized query; DB user chỉ có quyền tối thiểu (không DROP TABLE); WAF là lớp thêm, không đủ một mình.