15.6 Dependency hygiene
บทนี้รวบรวม debt ที่เกี่ยวข้องกับ dependency ที่ไม่ใช่ runtime หลัก แต่มีผลต่อ supply chain, ขนาดแพ็กเกจ, และความสามารถในการดูแล
รายการทั้งหมด
LEG-5 · AntD กระจาย major version สองตัว
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-web/package.json:21 — "antd": "^3.26.20" (v3, EOL 2020); vtrc-rc-backoffice/package.json:21 — "antd": "4.15.4" (v4, maintenance) |
| ปัญหา | product family เดียวกันใช้ design system กระจายสอง major version — component ที่ทำงานใน web อาจไม่ทำงานใน backoffice และกลับกัน |
| Impact | การ maintain component library ทำสองที่ ความไม่ consistent ของ UX ความยากในการ share component |
| Mitigation ระยะสั้น | ยกระดับ web ไป AntD v4 ก่อน (งานน้อยกว่า v5) |
| แนวทางระยะยาว | รวม design system เป็นตัวเดียว (Nuxt UI หรือ PrimeVue ถ้าย้าย Nuxt 3) |
LEG-6 · react-scripts 3.4.3 (CRA deprecated)
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-rc-backoffice/package.json:61 — "react-scripts": "3.4.3" |
| ปัญหา | Create React App (CRA) ถูก deprecated อย่างเป็นทางการในปี 2023 — react-scripts 3.4.3 มาพร้อม Webpack 4 (EOL), ESLint 6 (EOL), Workbox 4 (EOL), Babel 7.9 |
| Impact | เวลา build ช้า ไม่รองรับ feature ใหม่ ไม่ได้รับ security patch |
| Mitigation ระยะสั้น | ย้ายไป Vite ที่ใช้ Webpack 5 / esbuild |
| แนวทางระยะยาว | ย้ายไป Nuxt 3 |
LEG-7 · Webpack 4 EOL + html-webpack-plugin beta
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-web/package.json:106 — "webpack": "4.42.0"; ใช้ html-webpack-plugin 4.0.0-beta.11 (beta ใน production) |
| ปัญหา | Webpack 4 EOL ตั้งแต่ปี 2022 การใช้ beta version ของ plugin ใน production มีความเสี่ยง |
| Impact | build ช้า, ไม่รองรับ tree shaking แบบใหม่, ความเสี่ยงจาก beta |
| Mitigation ระยะสั้น | ยกระดับ Webpack เป็น v5 + html-webpack-plugin stable |
| แนวทางระยะยาว | ย้ายไป Vite หรือ Nuxt 3 |
LEG-8 · ldapjs ไม่ได้รับการพัฒนา
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | cu-central-api/main-api/package.json:30 — "ldapjs": "^2.2.0" |
| ปัญหา | ldapjs ไม่ได้รับการพัฒนา มีประวัติ CVE สาขา fork ที่ยังพัฒนาคือ ldapts |
| Impact | CVE ใหม่ ๆ ของ LDAP client ไม่ถูกแก้ |
| Mitigation ระยะสั้น | เปลี่ยนไป ldapts |
| แนวทางระยะยาว | ใช้ go-ldap/ldap ใน Go target |
LEG-9 · jsonwebtoken v8
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-api/api/package.json:41 + cu-central-api/.../package.json:42 — "jsonwebtoken": "^8.5.1" |
| ปัญหา | jsonwebtoken v8 มี CVE-2022-23529 family — เวอร์ชัน v9 แก้แล้ว |
| Impact | ความเสี่ยงด้าน authentication ถ้า CVE ถูก exploit |
| Mitigation ระยะสั้น | ยกระดับเป็น jsonwebtoken v9 (ตรวจ breaking changes) |
| แนวทางระยะยาว | ใช้ golang-jwt/jwt/v5 |
LEG-10 · html-pdf + node-qpdf ไม่ได้รับการพัฒนา
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-api/api/package.json:37,46 — html-pdf (PhantomJS, abandoned 2018) + node-qpdf (unmaintained 2017). ไม่มี ใน cu-central-api/main-api/package.json |
| ปัญหา | PDF stack ฝั่ง vtrc-api ทั้งก้อน EOL — PhantomJS ถูกแทนด้วย headless Chrome ตั้งแต่ปี 2018 |
| Impact | การแก้ bug ของ PDF generation ทำได้ยาก ความเสี่ยงด้าน security |
| Mitigation ระยะสั้น | เปลี่ยน html-pdf ไป Playwright/Puppeteer + headless Chrome |
| แนวทางระยะยาว | chromedp (Go) + pdfcpu สำหรับ encryption |
LEG-11 · mariaDB v2 + mysql2 v2 ทั้งคู่
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-api/api/package.json:40,45 — "mariadb": "^2.4.2" + "mysql2": "^2.1.0" |
| ปัญหา | ประกาศทั้งสอง driver โดยไม่ชัดเจนว่าใช้อันไหน — กลยุทธ์ driver กำกวม |
| Impact | ความสับสนในการ maintain ความเสี่ยงจากการใช้ driver ผิด |
| Mitigation ระยะสั้น | เลือก driver เดียวและลดอีกอัน — ยกระดับเป็น v3 |
| แนวทางระยะยาว | go-sql-driver/mysql ใน Go target |
LEG-12 · redis v3 (callback API)
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-api/api/package.json:50 — "redis": "^3.1.2"; cu-central-api/main-api/package.json:37 — "redis": "^3.0.2" (คนละ patch range แต่ยังเป็น major v3) |
| ปัญหา | redis v3 ใช้ callback API ที่เขียนยาก มีประวัติ CVE เวอร์ชัน v4 ใช้ Promise |
| Impact | code Redis อ่านยาก, ความเสี่ยง CVE |
| Mitigation ระยะสั้น | ยกระดับเป็น v4 (เปลี่ยน API เป็น await) |
| แนวทางระยะยาว | redis/go-redis/v9 |
LEG-13 · s, stream, findit — package ไม่ได้ใช้
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-api/api/package.json:34,51,52,53 — "s", "stream", "findit" — grep ยืนยัน 0 imports |
| ปัญหา | package ที่ไม่ได้ใช้ — เพิ่ม noise ใน supply chain, เพิ่มความเสี่ยง บางตัว (เช่น stream) มีชื่อเดียวกับ Node core module ทำให้ resolution กำกวม |
| Impact | ความเสี่ยง supply chain โดยไม่จำเป็น |
| Mitigation ระยะสั้น | ลบออกจาก package.json — ทำได้ภายใน 30 นาที |
| แนวทางระยะยาว | lint rule ที่ตรวจ dependency ที่ไม่ได้ใช้ |
LEG-27 · xlsx (SheetJS community) มี prototype-pollution CVE
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | cu-central-api/main-api/package.json:45 — "xlsx": "^0.16.9" |
| ปัญหา | SheetJS community edition มีประวัติ prototype-pollution CVE — เวอร์ชันใหม่อยู่บน CDN เท่านั้น (ไม่ใช่ npm) |
| Impact | ความเสี่ยงถ้า import Excel file ที่ผู้ใช้ประดิษฐ์ |
| Mitigation ระยะสั้น | ใช้ SheetJS จาก CDN build หรือ exceljs |
| แนวทางระยะยาว | xuri/excelize ใน Go target |
LEG-28 · sha512crypt-node
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | cu-central-api/main-api/package.json:39 — "sha512crypt-node": "^0.1.0" |
| ปัญหา | niche, unmaintained native-ish crypto |
| Impact | ความเสี่ยงถ้ามี CVE ในอนาคต การ maintain ยาก |
| Mitigation ระยะสั้น | เปลี่ยนไป bcrypt หรือ Argon2 |
| แนวทางระยะยาว | crypto/sha512 + golang.org/x/crypto ใน Go |
LEG-29 · firebase-admin v9 + googleapis v59
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-api/api/package.json:29,31 — firebase-admin ^9.2.0, googleapis ^59.0.0. ไม่มี ใน cu-central-api/main-api/package.json |
| ปัญหา | API drift มาก (ปัจจุบัน v12 และ v140+) — ความเร็วในการพัฒนาช้าลง ไม่ได้รับ feature ใหม่ |
| Impact | การใช้บริการใหม่ ๆ ของ Firebase/Google ทำไม่ได้ (เฉพาะ stack ที่ vtrc-api ใช้) |
| Mitigation ระยะสั้น | ยกระดับเป็นเวอร์ชันปัจจุบันใน vtrc-api |
| แนวทางระยะยาว | firebase.google.com/go/v4, google.golang.org/api ใน Go |
สรุป
| ID | รายการ | Severity | Effort ระยะสั้น |
|---|---|---|---|
| LEG-5 | AntD v3 + v4 | High | 1 สัปดาห์ (web → v4) |
| LEG-6 | react-scripts 3.4.3 | High | 1-2 สัปดาห์ (Vite) |
| LEG-7 | Webpack 4 EOL | High | 1 สัปดาห์ |
| LEG-8 | ldapjs unmaintained | High | 2-3 วัน |
| LEG-9 | jsonwebtoken v8 | High | 1 วัน |
| LEG-10 | html-pdf + node-qpdf | High | 1 สัปดาห์ |
| LEG-11 | mariadb + mysql2 ซ้อน | Med | 1 วัน |
| LEG-12 | redis v3 | High | 2-3 วัน |
| LEG-13 | s, stream, findit | Med | 30 นาที |
| LEG-27 | xlsx CVE | High | 1 วัน |
| LEG-28 | sha512crypt-node | Med | 1 วัน |
| LEG-29 | firebase-admin + googleapis | High | 2-3 วัน |
บทถัดไปจะไปยัง debt ด้านคุณภาพโค้ดและความสามารถในการดูแล