Nâng CaoBảo Mật iconBảo Mật

SQL Injection là gì? Cách phòng chống trong Node.js?

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.$queryRawSELECT 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.

Xem toàn bộ Bảo Mật cùng filter theo level & chủ đề con.

Mở danh sách Bảo Mật