Bạn có biết?
Một request POST với {"name": "'; DROP TABLE users; --"} có thể xóa sạch database của bạn. Một JSON.parse với payload 100MB có thể treo event loop. Bảo mật Node.js không phải "cài thêm firewall" — đa số lỗ hổng đến từ cách bạn viết code. Bài này liệt kê 10 lỗ hổng phổ biến nhất và cách vá từng cái, theo thứ tự mức độ nghiêm trọng.
1. Injection: SQL, NoSQL, Command
// ❌ SAI: ghép chuỗi trực tiếp — SQL injection
const q = `SELECT * FROM users WHERE email = '${req.body.email}'`;
// ✅ ĐÚNG: parameterized query
const q = "SELECT * FROM users WHERE email = ?";
const [rows] = await pool.query(q, [req.body.email]);
// ❌ SAI: chạy lệnh shell với input người dùng
exec(`rm -rf ${req.body.path}`);
// ✅ ĐÚNG: không bao giờ đưa input vào shell; dùng whitelist
if (!ALLOWED_PATHS.includes(req.body.path)) throw new AppError(400, "invalid path");
Nguyên tắc: không bao giờ ghép input vào query/lệnh. Parameterized query cho SQL, thư viện chính hãng cho NoSQL, tuyệt đối không exec shell với input.
2. Validate input: tin mọi thứ từ client là ác ý
import { z } from "zod";
// Schema khai báo rõ kiểu, giới hạn, bắt buộc
const createUserSchema = z.object({
: z.().(),
: z.().().().(),
: z.([, ]).(),
: z.().(),
});
app.(, (req, res) => {
data = createUserSchema.(req.);
(data);
res.().({ : });
});
0 bình luận
Đang tải bình luận...
Để lại bình luận