Tập 15: Flask cho phép tải file an toàn bằng send_file và send_from_directory trong 5 phút. Bạn sẽ nghe vì sao cách viết tay hay mắc hai lỗi cùng lúc: nối thẳng tên file từ URL vào đường dẫn nên kẻ xấu chèn ../ là thoát khỏi thư mục cho phép, và đọc hết file vào RAM trước khi trả về nên file càng lớn server càng nặng. Giải pháp là send_from_directory cho file đã có sẵn trong thư mục, với safe_join của Werkzeug chặn path traversal và trả 404 khi đường dẫn thoát ra ngoài, cùng as_attachment và download_name để ép tải xuống đúng tên file. Với file tạo ra trong lúc chạy như báo cáo CSV, dùng send_file với đối tượng file trong bộ nhớ và stream từng phần. Quy tắc chọn chỉ một câu: file sẵn trong thư mục thì send_from_directory, file tạo lúc chạy thì send_file — nhưng vẫn phải kiểm tra quyền sở hữu, giới hạn đuôi file và ghi log mỗi lượt tải.
Đọc bài viết đầy đủ kèm code mẫu đã kiểm chứng chạy được tại: Flask: cho phép tải file an toàn bằng send_file và send_from_directory trong 5 phút
English version
🎧 Nghe Linh Fish Dev Podcast trên:
