Rà soát mã nguồn: 26.08.2026
Rà soát toàn bộ api.conan.school, com.conan.school, docs.conan.school trên bốn trục: biên dịch, bảo mật, phụ thuộc, và nợ kỹ thuật.
Tóm tắt
| Trục | Trước | Sau | Trạng thái |
|---|---|---|---|
| Lỗ hổng phụ thuộc (high/crit) | 15 | 0 | ✅ Đã vá |
| Build | 3/3 pass | 3/3 pass | ✅ |
| Lỗi TypeScript, tokyo | 0 | 0 | ✅ |
| Lỗi TypeScript, api | 194 | 194 | ⚠️ Nợ kỹ thuật |
| SQL injection | 0 | 0 | ✅ |
| Secret hardcode | 0 | 0 | ✅ |
Đã sửa: 15 lỗ hổng bảo mật
Tất cả đều có bản vá sẵn và đã áp dụng. Nghiêm trọng nhất là hai phụ thuộc chạy thật (không phải dev):
| Gói | Lỗ hổng | Ảnh hưởng |
|---|---|---|
react-router 7.14.1 → 7.18.2 | turbo-stream cho phép thực thi mã tuỳ ý | Cổng thành viên |
hono | CSS Declaration Injection qua Style Object | API |
js-cookie | Prototype hijack theo instance | Cổng thành viên |
undici | Bỏ qua kiểm chứng chứng chỉ TLS · desync response | Cả hai |
nanoid | Bộ sinh không an toàn có thể lặp vô hạn | Cổng thành viên |
Còn lại thuộc chuỗi công cụ phát triển (vite, wrangler, miniflare, postcss, sharp, fast-xml-builder), rủi ro thấp hơn nhưng đã vá luôn.
Kiểm chứng sau khi vá
Nâng react-router lên minor mới nhất không phá vỡ gì: build pass, 0 lỗi TypeScript. Đây là lý do nên vá sớm thay vì tích luỹ tới lúc phải nhảy major.
Không có vấn đề: SQL và secret
SQL injection, sạch. Có 5 chỗ nối chuỗi vào câu SQL, tôi đã kiểm từng chỗ. Tất cả đều nối mảnh SQL cố định do code sinh ra, còn giá trị người dùng luôn đi qua .bind():
// admin/member_intelligence.ts, an toàn
const where = ['1=1']
if (search) { where.push(`lower(ms.email) LIKE ?${values.length + 1}`); values.push(`%${search}%`) }
db.prepare(`${sql} WHERE ${where.join(' AND ')}`).bind(...values)Chuỗi ${where.join()} chỉ chứa placeholder ?N, không chứa dữ liệu.
Secret, không có. Quét mẫu khoá OpenAI, AWS, GitHub, Slack trên toàn bộ mã nguồn: không kết quả.
Nợ kỹ thuật: 194 lỗi TypeScript ở api
Build vẫn pass vì esbuild bỏ qua type, nên đây không phải lỗi chạy, nhưng là mất an toàn kiểu.
| Mã lỗi | Số lượng | Nghĩa |
|---|---|---|
TS2345 | 92 | Kiểu tham số không khớp |
TS7006 | 65 | Tham số ngầm định any |
TS2339 | 21 | Truy cập thuộc tính không tồn tại |
| Khác | 16 |
Tập trung ở vài tệp:
| Tệp | Lỗi |
|---|---|
domains/admin/learning.ts | 75 |
domains/book-engine/legacy-importer.ts | 14 |
domains/mentor/index.ts | 13 |
domains/learning/index.ts | 13 |
domains/admin/users.ts | 13 |
Chưa sửa trong đợt này vì admin/learning.ts chiếm 39% tổng số lỗi và cần đọc kỹ logic nghiệp vụ; sửa vội dễ đổi hành vi ở khu vực quản trị đang chạy. Đề xuất xử lý theo tệp, mỗi tệp một PR riêng, bắt đầu từ admin/learning.ts.
Bảo vệ nội dung sinh bởi AI
Ngoài mã nguồn, đợt này còn siết các ràng buộc nội dung, kiểm bằng code thay vì tin vào prompt:
| Ràng buộc | Cơ chế |
|---|---|
| Câu hỏi không được chứa sẵn đáp án | leaksAnswer() loại item khi ghi |
| Không lặp câu giữa bài và các ô bên dưới | stripDuplicates() xoá câu trùng |
Tên khái niệm không lộ trước màn concept | assertJourneyInvariants() + sinh lại |
| Mọi màn phán đoán có "Chưa đủ bằng chứng" | Tự chèn khi ghi |
| Phản tư có câu so sánh trước/sau | Tự chèn khi ghi |
| Mỗi khoá 6–9 chặng, mỗi chặng 3 khái niệm | Ràng buộc schema |
| Ngân hàng đề đúng 25 câu mỗi chặng | Kiểm khi ghi |
Chi tiết ở Trải nghiệm học theo IB.
Việc còn lại
- 194 lỗi TypeScript ở api, xử lý theo tệp, ưu tiên
admin/learning.ts - Bốn khoá thiếu ảnh riêng,
Argument,Essay,Message,Problem Framingđang mượn render của trang khác context7chưa kết nối, nếu muốn rà soát dựa trên tài liệu thư viện cập nhật, cần thêm MCP server này vào cấu hình- Nhân nội dung IB ra 307 concept còn lại, hiện mới áp cho
LeadvàProspect