SQL Injection là attack inject SQL code qua user input để manipulate queries, bypass authentication, extract/delete data, hoặc execute OS commands (xp_cmdshell trong MSSQL).
- Classic example: username input là ' OR '1'='1' -- → query trở thành SELECT * FROM users WHERE username = '' OR '1'='1' -- ' AND password = '...' — luôn true, bypass login.
- Second-order injection: input được store vào DB, sau đó dùng trong query khác mà không sanitize — khó phát hiện.
- Phòng chống chính: parameterized queries/prepared statements — placeholder thay vì string concatenation: db.query('SELECT * FROM users WHERE id = $1', [userId]) — user input không bao giờ được interpret là SQL code.
- ORM như Prisma, Sequelize, TypeORM tự động parameterize — nhưng raw queries vẫn nguy hiểm nếu dùng template literals: prisma.$queryRaw
SELECT FROM users WHERE id = ${userId}(safe với tagged template) vs prisma.$queryRawUnsafe('SELECT FROM users WHERE id = ' + userId) (unsafe). - Stored procedures có thể vẫn bị nếu dùng dynamic SQL bên trong.
- Input validation là defense in depth nhưng không thể thay thế parameterized queries — validation có thể bị bypass.
- Principle of least privilege: DB user chỉ có quyền cần thiết — SELECT/INSERT/UPDATE nhưng không DROP TABLE, không xp_cmdshell.
- WAF (Web Application Firewall) thêm layer bảo vệ nhưng không đủ một mình.