Một hệ thống quản lý việc học giữ dữ liệu về trẻ vị thành niên. Nguyên tắc đơn giản nhất và cũng khó giữ nhất: dữ liệu không có thì không rò rỉ được. Mỗi trường thêm vào là một trường phải bảo vệ.
Giữ gì
- Email, tên, khối của học sinh — để đăng nhập và gắn bài giảng đúng người.
- Bài giảng theo tuần — đây là sổ theo dõi, tức bằng chứng việc dạy đã diễn ra.
- Tệp học liệu đã tải lên — phiếu bài tập, đề kiểm tra.
Không giữ gì
- Địa chỉ nhà, ảnh, số điện thoại — không có lý do nghiệp vụ nào cần đến, và đừng thêm vì "biết đâu sau này cần".
- Ảnh bài làm của bé — hấp dẫn vì tiện, nhưng đây là dữ liệu sinh trắc gần kề và không cần cho việc chấm bài.
Với trẻ vị thành niên, chỉ phụ huynh đứng tên tài khoản. Xoá tài khoản là đặt active=0 và xoá session — hệ thống làm việc này tự động, không cần thao tác thủ công.
Sao lưu: đừng dùng cp khi server đang chạy
Toàn bộ dữ liệu nằm trong hai chỗ: file SQLite và thư mục uploads. Nhưng SQLite chạy ở chế độ WAL, nên copy file lúc server đang ghi sẽ ra một bản thiếu — bản sao trông hợp lệ nhưng mất giao dịch gần nhất. Đây là kiểu lỗi chỉ phát hiện khi cần phục hồi, tức là lúc đã quá muộn.
- Server đang chạy: dùng lệnh backup của SQLite, không dùng cp — nó ghi nhất quán trong lúc có giao dịch.
- Server đã tắt: copy cả thư mục data là đủ, và đây là cách đơn giản nhất.
- Nhớ rằng file DB và thư mục uploads phải đi cùng nhau — phục hồi chỉ file DB sẽ ra bài giảng có link tới tệp không còn tồn tại.
Trước khi mở ra Internet
Bảo mật đã có sẵn: băm mật khẩu PBKDF2-SHA256 với 100.000 vòng và salt riêng cho từng người, cookie HttpOnly và SameSite=Lax, session 14 ngày, chặn đăng nhập sai 8 lần trong 10 phút theo IP, tên tệp trên đĩa là token ngẫu nhiên nên không đoán được đường dẫn, URL nguồn phải là http(s)://, mọi input được HTML-escape, và trần tải lên 25 MB mỗi tệp.
- Đặt sau reverse proxy có HTTPS (Caddy hoặc Nginx). Không bao giờ mở thẳng cổng ứng dụng ra Internet.
- Đổi mật khẩu admin mặc định trước khi đưa lên mạng — tài khoản mẫu và mật khẩu mẫu là thứ đầu tiên bị thử.
- Còn thiếu so với mức chạy thật: HTTPS tại tầng proxy, giới hạn dung lượng toàn ổ, và xoá tệp trên đĩa khi xoá bài giảng.
Hai điểm cuối đáng nói rõ vì chúng là nợ kỹ thuật, không phải lỗi: nếu không giới hạn dung lượng toàn ổ, một người dùng có thể làm đầy đĩa; và nếu không xoá tệp khi xoá bài giảng, đĩa giữ lại dữ liệu mà giao diện nói là đã xoá.
Phần còn lại của loạt bài: khung pháp lý và nhịp tuần, chọn và huấn luyện gia sư, kho 30 nguồn học liệu quốc tế.