2way-batch — Scorecard
Legend:
- Critical = active security/data-loss/availability risk
- High = correctness/maintainability hazard, real impact
- Medium = friction/hygiene, ยังไม่เป็นอันตรายระดับ production-breaking ทันที
2way-batch (branch: master, 96 tracked files) มีพื้นผิวโจมตี HTTP ต่ำในสถานะ wiring ปัจจุบัน (ไม่มี business controller mount) แต่มีปัญหา correctness/ops จาก cron stub และ hardcode IP ใน LineService
อย่าคัดลอกค่า secret / password จริงลงเอกสาร — อ้างชื่อตัวแปรและ file:line
Score summary
| Severity | จำนวน |
|---|---|
| Critical | 0 |
| High | 3 |
| Medium | 7 |
Findings
| ID | Severity | คำอธิบาย | หลักฐาน (file:line) | การแก้ไข |
|---|---|---|---|---|
| PERF-2WAYBATCH-01 | High | Cron รันทุก 10 วินาที (EVERY_10_SECONDS) แต่ทำงานจริงแค่ log ข้อความเปล่า — สิ้นเปลือง CPU/log ในขณะที่ fetchApproval / fetchCreateOutScope ถูก comment ปิด | src/crontab/survey/survey.task.service.ts:32-41 เทียบ method ที่ 43-172 | (1) เปิด logic จริงถ้ายังต้องใช้ หรือ (2) หยุด/ลดความถี่ cron และลบ stub |
| CORR-2WAYBATCH-01 | High | LineService.pushMassage hardcode http://10.188.128.126:9340/2way-batch/api/v1/line — ไม่ผ่าน env; และ LineController ไม่ได้ mount ใน AppModule ทำให้เส้นทาง push มีแนวโน้มพังถ้าเปิด cron logic | src/modules/line/line.service.ts:25-26, เทียบ app.module.ts:37-44 | ย้าย URL ไป env; ชี้ไป gateway ที่ live จริง (ตรวจ path/port ให้ตรง) |
| CORR-2WAYBATCH-02 | High | Methods ที่ถูก comment ใช้ data.map(async ...) โดยไม่ await และเรียก pushMassage (Observable) / updateSurveys แบบ fire-and-forget — ถ้า uncomment โดยไม่แก้ จะได้ race/missed updates | survey.task.service.ts:73-110, 140-171; line.service.ts:25-41 | ใช้ for...of + await / firstValueFrom; กัน cron overlap |
| SEC-2WAYBATCH-01 | Medium | TypeORM encrypt: false บน MSSQL connection | app.module.ts:30-33 | เปิด encrypt ตามมาตรฐานองค์กร |
| QUAL-2WAYBATCH-01 | Medium | โฟลเดอร์ announces / employees / uploadFiles (และ surveys/line controllers) มีไฟล์ครบแต่ไม่ import ใน AppModule — skeleton ค้างจาก 2way-api | app.module.ts:37-44 | ลบหรือแยก package ให้เหลือเฉพาะที่ cron ใช้ |
| QUAL-2WAYBATCH-02 | Medium | ไม่มี .env.example — ไม่มีหลักฐานใน git ว่าต้องตั้ง env อะไรบ้าง | ไม่พบไฟล์ .env* ที่ root จาก listing repo | เพิ่ม .env.example จาก keys ใน configuration.ts (โดยไม่ใส่ secret จริง) |
| QUAL-2WAYBATCH-03 | Medium | Dockerfile EXPOSE 3000 แต่ nginx/swagger/hardcode ชี้ 9340 | Dockerfile:24, nginx/conf.d/default.conf:8, docs/document.config.ts:8 | ทำให้พอร์ตตรงกันทั้ง EXPOSE / compose / docs |
| LEG-2WAYBATCH-01 | Medium | Build/runtime ใช้ node:16-alpine (EOL กันยายน 2023); CI image node:16 | Dockerfile:1,15, bitbucket-pipelines.yml:6 | อัปเกรด Node 18/20 LTS |
| OBS-2WAYBATCH-01 | Medium | TypeORM logging: ['error','query'] ใน connection factory — query log เต็มใน production ถ้าเปิดระดับนี้จริง | app.module.ts:28 | จำกัดเป็น error ใน production |
| QUAL-2WAYBATCH-04 | Medium | Controllers ที่ตายส่วนใหญ่ติด @Public(); repository มี raw SQL interpolate empCode ใน findByConditionV2 — ถ้า uncomment module โดยไม่ review จะเปิด API กว้าง / injection surface | ตัวอย่าง line.controller.ts:13-16; surveys.repository.ts:70 | ก่อนเปิด module ให้ทบทวน auth ทุก endpoint และเลิก string-build SQL |
สิ่งที่ตรวจแล้ว vs ยังไม่ตรวจ
ตรวจแล้ว (branch master):
AppModuleimports และ comment blocksSurveyTaskServiceทั้งไฟล์LineService.pushMassagehardcode URL + Observable returnSurveysService/SurveysUtil.initializerwiringconfiguration.ts,main.ts,Dockerfile, nginx default.confbitbucket-pipelines.ymlbranch triggers- ไม่มี
.env.example
ยังไม่ตรวจ:
- ว่า production ยังรัน process นี้จริงหรือไม่
- ว่า
10.188.128.126:9340ยังเป็น host ที่ถูกต้อง - เนื้อหาเต็มของทุก entity column /
dao.updateSurveytransaction details - ค่า secret จริงใน deployment (ไม่ควรใส่ในเอกสาร)
สรุปเชิงภาพรวม
2way-batch ไม่มี Critical security finding จาก HTTP surface ในสถานะปัจจุบัน แต่เป็น worker ที่ตื่นถี่โดยไม่มีงาน — และมี hardcode IP ในเส้นทาง LINE ที่จะพัง/ผิดที่ถ้าเปิด business cron กลับโดยไม่แก้ wiring ควรตัดสินใจว่าจะรวมงานเข้า 2way-api หรือฟื้น batch ให้ครบพร้อม gateway ที่ถูกต้อง