Skip to content

4 · Scorecard + debt register

Legend

  • Critical = active security/data-loss/availability risk
  • High = correctness/maintainability hazard, real impact
  • Medium = friction/hygiene, not yet dangerous

แก้ไขข้อสันนิษฐานเดิม — AntD version

docs/index.md ระบุกลุ่ม Web Frontends ว่าใช้ "AntD v3/v4" รวมกัน — สำหรับ vtrc-backoffice ผลตรวจคือ มี AntD เพียงเวอร์ชันเดียวคือ v4.15.4 (resolve จริงใน package-lock.json; package.json ระบุ range ^4.6.6) ไม่พบ AntD v3 ใน dependency tree ของ repo นี้ AntD v4 เข้าสู่ EOL ตาม policy ของ Ant Design เอง (v4 ไม่ได้รับ security patch ใหม่แล้วนับจากที่ v5 ออก) จึงยังนับเป็น LEG-BO-03 ได้ถูกต้อง แต่ severity ต่างจาก AntD v3 (v3 เก่ากว่าและเสี่ยงกว่า) — ควรแก้ claim ใน docs/index.md ให้ระบุแยกต่อ repo แทนการรวมเป็น "v3/v4"


Debt register

IDSeverityคำอธิบายหลักฐาน (file:line)ข้อเสนอการแก้ไข
CORR-BO-01Mediumaxios-workforce.js มี unreachable code — บรรทัดสองของ checkLinkURL() (endpoint UAT จริง) ไม่มีทาง execute เพราะ return ก่อนหน้าคืนค่า http://localhost:8083/... เสมอ ปัจจุบันยังไม่พบจุด import ใช้งานไฟล์นี้ใน src/ จึงยังไม่กระทบ production แต่หากมีใครนำไปใช้โดยไม่รู้ตัวจะพังทันทีvtrc-backoffice/src/config/axios-workforce.js:5-8ลบ return ที่ผิด หรือลบไฟล์ทั้งไฟล์หากยืนยันว่าไม่มีจุดใช้งานจริงอีกต่อไป
CORR-BO-02Highlogin flow hardcode isRemember = 1 ที่ทุกครั้งเมื่อ login สำเร็จ พารามิเตอร์ remember ที่ผ่านเข้า onSubmit ไม่ถูกใช้เลย และ LoginForm ไม่ได้ render checkbox "จำฉันไว้" ที่ import มา — ผลคือ token ถูกเก็บใน localStorage เสมอ ไม่มีทาง session-only ตามที่โค้ดออกแบบไว้vtrc-backoffice/src/pages/Login/index.js:45-78, vtrc-backoffice/src/components/LoginForm/index.js:1-21เพิ่ม Checkbox ในฟอร์มจริง ส่งค่า remember เข้า setToken แทนการ hardcode 1
SEC-BO-01Highผลตรงจาก CORR-BO-02 — access token + refresh token คงอยู่ใน localStorage แบบไม่มีวันหมด (จนกว่า logout/invalidate ฝั่ง server) ทำให้พื้นผิวเสี่ยงต่อการขโมย token ผ่าน XSS นานกว่าที่ควร (มี dangerouslySetInnerHTML ใช้อยู่ 20 ไฟล์ใน src/ เป็นพื้นผิว XSS ที่มีอยู่จริง)vtrc-backoffice/src/utils/auth.js:1-17 (setToken), ดูรายการไฟล์ dangerouslySetInnerHTML เช่น vtrc-backoffice/src/pages/ManageUser/index.js:1, vtrc-backoffice/src/pages/HospitalPaid/Payments/detail.js:1sanitize ทุกจุดที่ใช้ dangerouslySetInnerHTML ด้วย DOMPurify และแก้ CORR-BO-02 เพื่อจำกัดอายุการเก็บ token
QUAL-BO-01Mediumroutes.js มีบล็อก route ซ้ำที่ comment ปิดทั้งกลุ่มจำนวนมาก (ตัวอย่างช่วง 1118-1546 รวมกว่า 10 module) เป็นซากจากการ redesign เมนู (สอดคล้องกับชื่อ branch redesign-menu ที่มีอยู่จริงใน remote)vtrc-backoffice/src/config/routes.js:1118-1546ลบ block ที่ comment ปิดถ้ายืนยันว่าไม่ต้องใช้อ้างอิงย้อนหลังแล้ว
QUAL-BO-02Mediumมี checkLinkURL() สองตัวคนละไฟล์ (config/apollo.js และ utils/auth.js) ชื่อเดียวกันแต่คืนค่าคนละรูปแบบ (path GraphQL เต็ม vs host เปล่า) ตัวใน auth.js ไม่พบจุดเรียกใช้จริงในรอบตรวจนี้ (UNVERIFIED ว่ามีการ import จริงหรือไม่)vtrc-backoffice/src/utils/auth.js:50-64ยืนยันว่ามีการใช้งานจริงหรือไม่ ถ้าไม่มีให้ลบทิ้งเพื่อลดความสับสน
QUAL-BO-03Mediumไฟล์ backup/legacy (*_bk*.js, *-prd.js) กระจายอยู่ใน src/pages/ และ src/graphql/, src/config/ อย่างน้อย 41 ไฟล์ (ไม่รวม nginx.default.conf.bak ที่ root)ตัวอย่าง: vtrc-backoffice/src/pages/HospitalPaid/Payments/index_bk.js:1, generator_bk.js:1, generatorFileDetail_bk-bk.js:1, generatorFileDetail-prd.js:1, vtrc-backoffice/src/graphql/queries_bk.js:1, vtrc-backoffice/src/config/routes_bk.js:1จัดเก็บ history ผ่าน git แทนการ commit ไฟล์ backup คู่ขนาน แล้วลบไฟล์เหล่านี้ทีละล็อตหลังยืนยันไม่มีการอ้างอิง
LEG-BO-01MediumDockerfile ไม่ build จาก source (FROM nginx:1.18 เท่านั้น) การ deploy จริงพึ่งพา build/ ที่ commit ไว้ล่วงหน้า (~47 MB) ผ่าน docker-compose.yml bind-mount — ไม่มี reproducible build ใน container image เองvtrc-backoffice/Dockerfile:1-2, vtrc-backoffice/docker-compose.yml:9-19เพิ่ม multi-stage build (npm install && npm run build) ใน Dockerfile ตาม pattern ที่ vtrc-backoffice-new ใช้อยู่แล้ว (ดู volume ของ repo นั้น) แล้วเลิก commit build/
LEG-BO-02Mediumreact-scripts (CRA) คงที่ 3.4.3 — เวอร์ชันเก่ามาก (ปี 2020) ไม่ได้รับ security patch ของ webpack/babel ที่ bundle มาด้วยvtrc-backoffice/package.json:40อัปเกรด CRA เป็นเวอร์ชันใหม่ หรือย้ายไป Vite
LEG-BO-03MediumAntD คงที่ v4.15.4 — อยู่ใน EOL branch ของ Ant Design (v4 ไม่รับ security patch ใหม่แล้ว) ไม่ใช่ v3 ตามที่เอกสารระดับ volume-index สื่อไว้แบบกว้าง — ต้องแก้ claim ให้เจาะจงต่อ repovtrc-backoffice/package.json:11, lockfile antd@4.15.4วางแผนอัปเกรดเป็น AntD v5 (breaking change สูง ต้องผ่าน migration guide ของ Ant Design)
OBS-BO-01Mediumconsole.log/warn/error ถูก override เป็น no-op ทุกครั้งที่ App mount — debug ผ่าน browser console ใน production ไม่ได้เลย ต้องพึ่ง debugger statement หรือ network tab แทนvtrc-backoffice/src/containers/App/index.js:14ลบ override นี้ หรือทำให้ conditional ตาม environment แทนการปิดถาวร
PERF-BO-01Mediumไม่พบการใช้ React.lazy/route-level code splitting ที่ใดใน src/ — ทุก page bundle เข้า main chunk เดียว ประกอบกับ build/ ที่ commit ไว้มีขนาด ~47 MB (ไม่รวม node_modules)ผลจาก full-text search React.lazy/lazy( ทั่ว vtrc-backoffice/src (ไม่พบ), ขนาด vtrc-backoffice/build/ ~47 MBเพิ่ม React.lazy + Suspense ระดับ route ตาม module ใน routes.js

Scorecard สรุป

ด้านคะแนนหมายเหตุ
โครงสร้างโค้ด5/1041 ไฟล์ backup ปนอยู่ใน tree, route block ที่ comment ปิดจำนวนมาก
การ build4/10ไม่มี build stage ใน Docker, พึ่งพา build/ ที่ commit ไว้
การจัดการ auth4/10token ไม่มีวันหมดอายุใน localStorage (bug ไม่ใช่ตั้งใจ), auth gate ตรวจแค่ boolean
Security4/10XSS surface (20 ไฟล์ dangerouslySetInnerHTML) + token persistence bug
Performance5/10ไม่มี code splitting แต่ bundle เดี่ยว (~47 MB build) เล็กกว่า vtrc-rc-backoffice
Maintainability5/10pattern สม่ำเสมอกว่า vtrc-rc-backoffice (ไม่มี MUI ปนแบบสะเปะสะปะ) แต่มีไฟล์ backup มาก
Observability3/10console ปิดหมดใน production
Testing1/10ไม่พบ test จริงใน src/ (ทำเครื่องหมาย UNVERIFIED สำหรับการยืนยัน __tests__ ว่างทั้งหมด — ไม่ได้ไล่ตรวจทุกไฟล์)
รวม (โดยประมาณ)3.9/10ใกล้เคียงกับ vtrc-rc-backoffice (v1: 4.2/10) — มีหนี้ทางเทคนิคเชิงโครงสร้างและ security ใกล้เคียงกัน

คะแนนนี้เป็นการประเมินเชิงคุณภาพจากหลักฐานที่ตรวจพบในรอบนี้ ไม่ใช่ metric อัตโนมัติ ควร cross-check กับทีมที่ดูแลระบบจริงก่อนใช้ประกอบการตัดสินใจ


ความสัมพันธ์กับ vtrc-backoffice-new

ดูรายละเอียดเต็มใน _partial-index-backoffices.md — สรุปสั้น: เป็น repo คนละตัวใน Bitbucket (i3dev/vtrc-backoffice.git vs i3dev/vtrc-backoffice-new.git) แต่ source code เกือบเหมือนกันทุกไฟล์ (vtrc-backoffice-new มี Dockerfile ที่ build จาก source จริง ต่างจาก repo นี้ที่ยังพึ่ง build/ ที่ commit ไว้ — ดู LEG-BO-01)