Express Security !!!?
จากบทความที่แล้ว เราก็ได้พูดถึง CORS กันไปแล้ว วันนี้ก็จะมาพูดถึงเรื่อง Security ของ Application กันบ้าง
อ่านเรื่อง CORS ด้านล่างนี้
นอกจากการพัฒนา Application แล้ว Security ก็เป็นสิ่งสำคัญ การป้องกันช่องโหว่ Dev อย่างเราก็ต้องตระหนักความปลอดภัยต่างๆ นอกเขียนโค้ดเทพแล้ว ต้องใส่ใจ Security ด้วยนะทุกคน
เริ่มกันเลย!
1.ตรวจสอบ version ของ express อยู่เสมอ
เพราะว่าเก่า version อาจจะมีบัคที่ยังไม่ได้แก้ไข version ใหม่ก็จะมาแก้บัคอันเก่าให้ แนะนำให้ ตรวจสอบ version และ หมั่นอัปเดต version อยู่เสมอ
สามารถตรวจสอบจากด้านล่างได้เลย
2.Use TSL
TSL ย่อมาจาก Transport Layer Security หลักการของ TLS คือการเข้ารหัสการสื่อสารระหว่างเว็บแอปพลิเคชันและเซิร์ฟเวอร์ TSL พัฒนามาจาก SSL (Secure Socket Layer)
ตัวอย่างด้านล่างนี้
3.Use Helmet
Helmet สามารถช่วยปกป้อง Application ของเราจากช่องโหว่ได้ระดับนึง โดยจะตั้งค่าส่วน HTTP Headers ที่เกี่ยวข้องกับความปลอดภัยให้เรา
ตัวอย่าง headers
Content-Security-Policy (CSP)
เซ็ตเพื่อให้เชิร์ฟเวอร์สามารถกำหนดนโยบายต่างๆ browser ให้ตรวจสอบข้อมูลหน้าเว็บหรือ script ที่เป็นอันตรายก่อนที่จะส่งมาถึงเชิร์ฟเวอร์ได้
script ที่เป็นอันตราย เช่น script ที่สามารถอ่านไฟล์ หรือ อ่าน DataBase ได้
Content-Security-Policy: default-src 'none'
//กำหนด default-src 'none' คือห้ามส่ง script ใดๆเข้ามา
X-Powered-By
เซ็ตเพื่อ ซ่อน Tech Stack ที่เราใช้ หากเราไม่ซ่อนตรงนี้ แฮ็กเกอร์เจอ อาจจะไปหาช่องโหว่จาก version เก่าๆ มาแฮ็ก Application ของเราได้
//ถ้าปิดใช้งาน ตัวนี้ X-Powered-By จะไม่แสดงให้เห็น
HTTP Strict Transport Security (HSTS)
เซ็ตเพื่อบังคับให้คุยกันผ่าน HTTPS เท่านั้น
Strict-Transport-Security: max-age=31536000; includeSubDomains
//max-age=31536000 กำหนดระยะเวลาให้คุยแบบ HTTPS หลังจากส่ง request มาที่ server และก็จะส่งกลับไปบอก browser ให้รับรู้ หากครบเวลากำหนดก็จะส่งกลับมาบอกใหม่
//includeSubDomains กำหนดให้คุยแบบ HTTPS กับ Sub Domains
X-Download-Options
เซ็ตสำหรับ IE8 มันเกี่ยวข้องกับวิธีที่ IE 8 จัดการกับไฟล์ HTML ที่ดาวน์โหลดมา ยกตัวอย่างเช่น เราดาวน์โหลดเว็บมา cookie อาจติดไปด้วย
X-Download-Options: noopen
Cache-Control
เซ็ตเพื่อปิดใช้งานการแคชของฝั่งไคลเอ็นต์
//ถ้าปิดใช้งาน ตัวนี้ Cache-Control จะไม่แสดงให้เห็น
X-Content-Type-Options
เซ็ตเพื่อป้องกันการโจมตีผ่านทางช่องโหว่ MIME sniffing ยกตัวอย่างเช่น การอัปโหลดไฟล์ ข้างในไฟล์อาจซ่อนไฟล์ที่เป็นอันตรายกับเซิฟเวอร์ได้
X-Content-Type-Options: nosniff
X-Frame-Options
เซ็ตเพื่อป้องกันการ clickjacking ยกตัวอย่างเช่น มีคนเอา page เราไปใส่ไว้ใน iframe แล้วทำเป็นโปร่งใส เมื่อมีการ click บางจุดในเว็บ ปุ่มที่ถูกซ้อนก็จะทำงาน
X-Frame-Options: SAMEORIGIN
//กำหนดให้โดเมนต้นทางเดียวกันสามารถแสดงผลใน Frame บนหน้าเว็บไซต์ได้
X-XSS-Protection
เซ็ตเพื่อเปิดใช้งานตัวกรอง Cross-site scripting (XSS)
X-XSS-Protection: 1; mode=block
//0 คือ disable และ 1 คือ enable
//1; mode=block คือการกรองหา XSS เมื่อพบแล้วจะทำการหยุดการ render page
ลง helmet
// ...
const helmet = require('helmet')
app.use(helmet())
// ...
4. Use cookies
Options cookie
secure
- ให้เบราว์เซอร์ส่งคุกกี้ผ่าน HTTPS เท่านั้นhttpOnly
- ให้ส่งคุกกี้ผ่าน HTTP (S) เท่านั้น (ช่วยป้องกันการโจมตี cross-site scripting)domain
- ระบุโดเมนของคุกกี้path
- ระบุเส้น path ของคุกกี้expires
- ใช้เพื่อกำหนดวันหมดอายุของคุกกี้
ตัวอย่าง
const session = require('cookie-session')
const express = require('express')
const app = express()
const expiryDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hourapp.use(session({
name: 'session',
keys: ['key1', 'key2'],
cookie: {
secure: true,
httpOnly: true,
domain: 'example.com',
path: 'foo/bar',
expires: expiryDate
}
}))
5. ป้องกัน brute-force attacks against authorization
ตรวจสอบให้แน่ใจว่าระบบ login ของเรานั้นปลอดภัยหรือยัง ดังต่อไปนี้
5.1 ตรวจสอบจำนวน login ที่ผิดพลาด ใน user เดียวกันคล้ายกัน และ IP เดียวกัน
5.2 ตรวจสอบจำนวน login ที่ผิดพลาด ในระยะเวลาที่ไล่เลี่ยกันเป็นเวลานาน และบล็อกที่อยู่ IP หากพยายามที่จะล้มเหลว 100 ครั้งในหนึ่งวัน
อย่าลืม กำหนด rate limit ด้วยนะ
6.ตรวจสอบให้แน่ใจว่า dependencies ของคุณปลอดภัย
การใช้ npm เพื่อจัดการ dependencies แอปพลิเคชันของคุณมีประสิทธิภาพและสะดวกสบาย แต่แพ็กเกจที่คุณใช้อาจมีช่องโหว่ด้านความปลอดภัยที่สำคัญซึ่งอาจส่งผลกระทบต่อแอปพลิเคชันของคุณด้วย
npm audit //ตรวจสอบ dependencies
แนะนำให้ใช้ snyk
npm install -g snyk
cd your-appsnyk auth //loginsnyk test //ทดสอบช่องโหว่snyk wizard //ใช้คำสั่งนี้เพื่อเปิดวิซาร์ดที่จะแนะนำกระบวนการใช้อัพเดตแพตช์เพื่อแก้ไขช่องโหว่
7.หลีกเลี่ยงสิ่งที่จะทำให้เกิดช่องโหว่
สามารถเช็คได้จากด้านล่างนี้ได้เลย
8.ข้อแนะนำเพิ่มเติม
แนะนำ checklist ของ nodejs อ่านเพิ่มเติมจากด้านล่างนี้ได้เลย
สรุป
ก่อนจะขึ้น Production เราควรตรวจสอบ Security ของ Application กันก่อน เพื่อป้องกันโจมตี Application จากเหล่าแฮ็กเกอร์ทั้งหลาย นอกเขียนโค้ดเทพแล้ว ต้องใส่ใจ Security ด้วยนะทุกคน
หวังว่าบทความนี้จะเป็นประโยชน์กับ dev ทุกคนนะครับ หากผิดพลาดประการใด ต้องขออภัยมา ณ ที่นี้ด้วยครับ