Skip to content

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ụcTrướcSauTrạng thái
Lỗ hổng phụ thuộc (high/crit)150✅ Đã vá
Build3/3 pass3/3 pass✅
Lỗi TypeScript, tokyo00✅
Lỗi TypeScript, api194194⚠️ Nợ kỹ thuật
SQL injection00✅
Secret hardcode00✅

Đã 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óiLỗ hổngẢnh hưởng
react-router 7.14.1 → 7.18.2turbo-stream cho phép thực thi mã tuỳ ýCổng thành viên
honoCSS Declaration Injection qua Style ObjectAPI
js-cookiePrototype hijack theo instanceCổng thành viên
undiciBỏ qua kiểm chứng chứng chỉ TLS · desync responseCả hai
nanoidBộ sinh không an toàn có thể lặp vô hạnCổ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():

ts
// 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ỗiSố lượngNghĩa
TS234592Kiểu tham số không khớp
TS700665Tham số ngầm định any
TS233921Truy cập thuộc tính không tồn tại
Khác16

Tập trung ở vài tệp:

TệpLỗi
domains/admin/learning.ts75
domains/book-engine/legacy-importer.ts14
domains/mentor/index.ts13
domains/learning/index.ts13
domains/admin/users.ts13

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ộcCơ chế
Câu hỏi không được chứa sẵn đáp ánleaksAnswer() loại item khi ghi
Không lặp câu giữa bài và các ô bên dướistripDuplicates() xoá câu trùng
Tên khái niệm không lộ trước màn conceptassertJourneyInvariants() + 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/sauTự chèn khi ghi
Mỗi khoá 6–9 chặng, mỗi chặng 3 khái niệmRàng buộc schema
Ngân hàng đề đúng 25 câu mỗi chặngKiểm khi ghi

Chi tiết ở Trải nghiệm học theo IB.

Việc còn lại ​

  1. 194 lỗi TypeScript ở api, xử lý theo tệp, ưu tiên admin/learning.ts
  2. Bốn khoá thiếu ảnh riêng, Argument, Essay, Message, Problem Framing đang mượn render của trang khác
  3. context7 chư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
  4. Nhân nội dung IB ra 307 concept còn lại, hiện mới áp cho Lead và Prospect

Tài liệu nội bộ nền tảng Conan School.