แอป Node.js ที่ปลอดภัยคือแอปที่ปกป้องข้อมูลผู้ใช้และความถูกต้องของระบบโดยการป้องกันการโจมตีที่พบบ่อย (เช่น injection และ account takeover), ลดการรั่วไหลของข้อมูลโดยไม่ตั้งใจ และกันพฤติกรรมเสี่ยงออกจาก runtime และ dependencies
นี่คือ คู่มือพื้นฐาน สำหรับนักพัฒนาและทีมลีดที่ต้องการประใช้แนวปฏิบัติที่ดีที่สุดสำหรับแอป Node.js ที่ปลอดภัยตั้งแต่เริ่มต้น โดยเน้นแนวทางปฏิบัติที่ทำซ้ำได้ซึ่งยกระดับ baseline ความปลอดภัยโดยไม่ต้องเปลี่ยนโปรเจกต์ให้กลายเป็นงานวิจัยด้านความปลอดภัย
สิ่งที่ต้องทำก่อน
- ตรวจสอบทุกอินพุตด้วย schema ที่เข้มงวด
- ใช้ parameterized queries; ห้ามต่อสตริงอินพุตผู้ใช้เข้ากับ query
- hash รหัสผ่านด้วย Argon2id เมื่อรองรับ (bcrypt เป็น fallback ที่ mature)
- ปกป้อง session และ token (cookie flags, JWT hygiene)
- ใช้ baseline protections เช่น security headers และ CORS allowlist ที่เข้มงวด
- ปฏิบัติ logging hygiene: บันทึกเหตุการณ์ความปลอดภัย แต่ไม่บันทึก secrets หรือ token
- ทำ dependency และ security checks แบบอัตโนมัติ แต่ถือว่าเป็นสัญญาณ ไม่ใช่การรับประกัน

Security baseline สำหรับแอป Node.js (เริ่มตรงนี้)
เริ่มจาก baseline ที่สะอาด เหตุการณ์ส่วนใหญ่ไม่ได้เกิดจากการพลาดเทคนิคขั้นสูง แต่เกิดจากค่าเริ่มต้นที่ไม่ปลอดภัยถูกปล่อยทิ้งไว้นานเกินไป
- ใช้ Node.js LTS ที่ยังได้รับการสนับสนุนสำหรับงาน production
- อัปเดต runtime และ dependencies ให้ทันสมัย
- แยกการตั้งค่า dev/prod (feature flags, env vars, logging levels)
- ปิดการเปิดเผยข้อมูลเซิร์ฟเวอร์ที่ไม่จำเป็น เช่น
x-powered-by - ไม่เปิดเผย stack traces ใน production responses
สำหรับ checklist อย่างเป็นทางการแบบกระชับ ดู Node.js security best practices
ตัวอย่าง: ปิด server disclosure และทำ sanitize errors

// Express example
app.disable('x-powered-by');
app.use((err, req, res, next) => {
req.log?.error({ err }, 'Unhandled error');
res.status(500).json({ error: 'Something went wrong.' });
});
ตรวจสอบอินพุตและป้องกัน injection
เริ่มจากหลักการ แล้วค่อยเลือกเครื่องมือ
หลักการ 1: ตรวจสอบที่ boundary
ตรวจสอบอินพุตให้เร็วที่สุดเท่าที่จะเป็นไปได้ — ก่อน business logic และก่อนการเรียกฐานข้อมูลใดๆ ไลบรารีตรวจสอบ schema อย่าง Joi หรือ Zod ช่วยได้ แต่แนวคิดหลักเหมือนกัน: รับเฉพาะสิ่งที่คาดหวังเท่านั้น
หลักการ 2: ใช้ parameterized queries
หลีกเลี่ยงการสร้าง query string ด้วยอินพุตผู้ใช้ ใช้ parameterized queries ผ่าน ORM หรือ query builder Prisma, Drizzle, Knex และ database client ที่ mature ส่วนใหญ่รองรับ parameterization
หลักการ 3: encode output ตามบริบท
ถ้าแอป render เนื้อหาของผู้ใช้ ให้ทำ output encoding ตามบริบทที่ใช้ (HTML, attributes, URLs) พูดถึง HTML sanitizer อย่าง DOMPurify เฉพาะเมื่อแอป รับหรือ render HTML จริงๆ
ตัวอย่าง: schema validation ที่ API boundary

// Zod example (library choice is optional)
const { z } = require('zod');
const createUserSchema = z.object({
email: z.string().email(),
password: z.string().min(12).max(128),
});
const parsed = createUserSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({ error: 'Invalid input.' });
}
ใช้ authentication และ session security ให้ถูกต้อง
ข้อผิดพลาดด้าน auth อาจทำให้ bug เล็กกลายเป็นการเข้าครอบครองบัญชีทั้งหมด รักษา implementation ให้น่าเบื่อและเข้าใจได้ชัดเจน
Password hashing: นิยม Argon2id, bcrypt เป็น fallback
ใช้ Argon2id เมื่อ stack รองรับ bcrypt เป็น fallback ที่ mature เมื่อ Argon2id ไม่พร้อมใช้งานหรือต้องการความเข้ากันได้กับ password store ที่มีอยู่
สำหรับคำแนะนำเกี่ยวกับการเลือกพารามิเตอร์อย่างปลอดภัย ดู OWASP password storage guidance
Session และ token ที่ปลอดภัย
- ตั้งค่า cookie flags เมื่อเกี่ยวข้อง:
httpOnly,secure,sameSite - ถือว่า JWT เป็น credential อายุสั้น หลีกเลี่ยงข้อมูลลับใน payload
- หลีกเลี่ยง storage pattern ที่อ่อนแอซึ่งทำให้ token ถูก XSS เข้าถึง
เพิ่ม MFA สำหรับบัญชี admin
แม้ไม่บังคับ MFA สำหรับผู้ใช้ทุกคน ก็ควรบังคับสำหรับบัญชี admin และบัญชีสิทธิ์สูง
Rate limiting สำหรับ endpoint login/token
const rateLimit = require('express-rate-limit');
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 5,
standardHeaders: true,
});
app.post('/auth/login', authLimiter, loginHandler);
หากต้องการก้าวจากพื้นฐานไปสู่โปรแกรมความปลอดภัยใน production แบบเต็มรูปแบบ ดูคู่มือขั้นสูงเรื่อง ความปลอดภัย Node.js ในโปรดักชัน
จัดการ secrets และข้อมูลอ่อนไหวอย่างปลอดภัย
- ไฟล์
.envเหมาะสำหรับการพัฒนาในเครื่อง แต่ไม่ใช่โซลูชันจัดการ secrets สำหรับ production - ใน production ควรใช้ secret store เช่น KMS, Secrets Manager, Vault หรือการจัดการ secrets ในตัวของแพลตฟอร์ม
- ใช้ HTTPS และเข้ารหัสข้อมูลอ่อนไหว at rest เมื่อเหมาะสม
- ไม่บันทึก secrets, รหัสผ่าน, token หรือ request body ทั้งหมดโดยค่าเริ่มต้น
สำหรับมุมมองที่กว้างขึ้นเกี่ยวกับแนวปฏิบัติระดับโปรแกรม ดูคู่มือเรื่อง การจัดการความปลอดภัยข้อมูล
เพิ่ม security checks เข้า workflow การพัฒนา
ใช้ npm audit (แต่อย่าพึ่งมันอย่างเดียว)
npm audit ช่วยค้นหา known vulnerabilities แต่ใช้คนเดียวไม่ได้ ถือว่าเป็นหนึ่งในหลายสัญญาณ
เพิ่มการตรวจแบบเบา
- ESLint security plugins (จับ pattern เสี่ยงที่พบบ่อย)
- basic SAST scanning (อย่างน้อยใน pull requests)
- unit tests สำหรับ authorization rules (route สำคัญ)
- PR security checklist แบบง่าย (inputs, authz, secrets, logging)
Checklist แอป Node.js ที่ปลอดภัย

- ใช้ Node.js LTS ที่รองรับ
- อัปเดต dependencies และลบแพ็กเกจที่ไม่ใช้
- validate inputs ด้วยสคีมาเข้มงวด
- ใช้ parameterized queries และหลีกเลี่ยง string concatenation
- hash รหัสผ่านด้วย Argon2id (bcrypt fallback)
- ตั้งค่า cookie flags และ JWT hygiene
- ตั้งค่า security headers และ strict CORS allowlists
- ไม่เผย stack traces ใน production
- ไม่ log secrets/tokens หรือข้อมูลอ่อนไหว
- รัน
npm auditเป็นประจำและใช้เป็นจุดเริ่มต้น - เพิ่ม checks ใน CI และ PR review
คำถามที่พบบ่อย
แนวปฏิบัติที่ดีที่สุดสำหรับแอป Node.js ที่ปลอดภัยคืออะไร?
แนวปฏิบัติที่ดีที่สุดมุ่งเน้นการลดพื้นที่โจมตีตั้งแต่วันแรก: ตรวจสอบอินพุตทั้งหมด, ใช้ parameterized queries, hash รหัสผ่านด้วย Argon2id (หรือ bcrypt), ปกป้อง session และ token, ตั้งค่า security headers และ CORS แบบเข้มงวด, ไม่ให้ secrets อยู่ในโค้ดและล็อก และทำ dependency และ security checks อัตโนมัติใน workflow
Node.js ปลอดภัยโดยค่าเริ่มต้นหรือไม่?
Node.js ไม่ได้ไม่ปลอดภัยโดยค่าเริ่มต้น แต่ความปลอดภัยขึ้นอยู่กับโค้ดและการตั้งค่าของแอป แอป Node.js ที่ปลอดภัยต้องมีค่าเริ่มต้นที่ตั้งใจสำหรับการตรวจสอบอินพุต, การตรวจสอบสิทธิ์, การจัดการข้อผิดพลาด, การจัดการ secrets และการดูแล dependencies
วิธีที่ดีที่สุดในการเก็บรหัสผ่านใน Node.js คืออะไร?
ควรใช้ Argon2id หากสแตกของคุณรองรับ และใช้ bcrypt เป็นตัวเลือกสำรองที่ mature และเข้ากันได้กว้าง อย่าเก็บรหัสผ่านแบบ plain text และหลีกเลี่ยง hash ที่เร็ว เช่น MD5 หรือ SHA1 สำหรับการเก็บรหัสผ่าน
จะตรวจสอบอินพุตใน Node.js APIs ได้อย่างไร?
ตรวจสอบที่ boundary ของระบบด้วย schema ที่เข้มงวด (เช่น ด้วยไลบรารีอย่าง Joi หรือ Zod) ผสานการตรวจสอบ schema กับ parameterized queries และ output encoding ตามบริบทเพื่อลดความเสี่ยง injection และ XSS
จะทำให้ JWT authentication ใน Node.js ปลอดภัยได้อย่างไร?
ทำให้ JWT มีอายุสั้น, หลีกเลี่ยงข้อมูลลับใน payload และเลือก pattern การเก็บและส่งที่ปลอดภัย ใช้ secure cookies เมื่อเหมาะสม, ทำ token rotation เมื่อจำเป็น และทำ rate limiting สำหรับ endpoint login และ token
npm audit เพียงพอหรือไม่?
ไม่เพียงพอ npm audit มีประโยชน์ในการค้นหาช่องโหว่ที่ทราบ แต่ไม่รับประกันความปลอดภัยโดยรวมของแอป ต้องใช้ร่วมกับ secure coding, testing และกระบวนการ review เพื่อลดความเสี่ยงจริง
บทสรุป
การพัฒนา Node.js ที่ปลอดภัยขึ้นอยู่กับพื้นฐานที่สม่ำเสมอ: ตรวจสอบอินพุต, ปกป้อง authentication, กัน secrets ออกจากโค้ดและล็อก และผนวก security checks เข้ากับ workflow เริ่มจากแนวปฏิบัติ baseline ในคู่มือนี้ แล้วค่อยยกระดับตามการเติบโตของแอป
หากต้องการความช่วยเหลือในการสร้างแอป Node.js ที่ปลอดภัยด้วยรากฐานวิศวกรรมที่มั่นคง HDWEBSOFT มี บริการพัฒนา Node.js