PHP upload ảnh và PDF: kiểm tra gì để tránh tải lên tệp nguy hiểm?

Đang tìm đáp án

46 lượt xem · 7 trả lời

Cộng đồng đang cùng tìm lời giải

Người đặt câu hỏi có thể chọn câu trả lời hữu ích nhất làm đáp án.

1. 12:26 06/08/2026
Chào mọi người, Ứng dụng của mình cho phép đính kèm ảnh và PDF. Mình biết chỉ kiểm tra phần mở rộng là chưa đủ, nhưng chưa có một quy trình rõ ràng để xử lý tệp an toàn từ lúc nhận upload đến lúc hiển thị lại. Admin có thể gợi ý những bước kiểm tra quan trọng nhất không?
0 Facebook
2. 12:26 06/08/2026
Chào bạn Minh, Đúng như bạn nói, không được tin tên tệp, MIME do trình duyệt gửi hoặc phần mở rộng đơn lẻ. Hãy áp dụng whitelist cả phần mở rộng lẫn MIME thực tế xác định bằng finfo; giới hạn dung lượng, số tệp và kiểm tra lỗi upload của PHP trước khi lưu. Đổi sang tên ngẫu nhiên do máy chủ sinh, không dùng trực tiếp tên gốc làm đường dẫn, và nên lưu ngoài document root hoặc cấu hình thư mục upload không được thực thi script. Với ảnh, có thể đọc lại bằng thư viện ảnh và tạo phiên bản hiển thị riêng; với tệp tải xuống, trả qua endpoint kiểm soát quyền khi nội dung không công khai. Cũng cần đặt header tải xuống phù hợp, ghi log sự cố và quét mã độc nếu môi trường của bạn có công cụ hỗ trợ.
0
3. 19:25 06/10/2026
Trả lời Minh Vũ Chào mọi người, Ứng dụng của mình cho phép đính kèm ảnh và PDF. Mình biết chỉ kiểm tra phần mở rộng là chưa đủ, nhưng ch…
Để tránh tệp nguy hiểm, bạn nên kết hợp kiểm tra MIME type bằng finfo_file và kiểm tra nội dung thực tế (ví dụ: kiểm tra magic number của ảnh hoặc PDF). Giới hạn dung lượng file (ví dụ
0
4. 19:31 06/10/2026
Trả lời Biên Tập Viên Để tránh tệp nguy hiểm, bạn nên kết hợp kiểm tra MIME type bằng finfo_file và kiểm tra nội dung thực tế (ví dụ: kiểm tra…
Trong PHP, bạn có thể kết hợp hàm finfo_file để đọc loại MIME thực sự từ nội dung tệp, sau đó so sánh kết quả này với một danh sách các loại được phép chấp nhận (ví dụ: image/jpeg, application/pdf). Ngoài
0
5. 16:18 09/10/2026
Trả lời Minh Vũ Chào mọi người, Ứng dụng của mình cho phép đính kèm ảnh và PDF. Mình biết chỉ kiểm tra phần mở rộng là chưa đủ, nhưng ch…
Bạn nên kết hợp kiểm tra phần mở rộng với nhiều lớp kiểm tra nội dung: 1. **Xác thực MIME và chữ ký tệp** – sử dụng `finfo_file()` cho hình ảnh và `pdfinfo` (hoặc thư viện PDF PHP) để xác nhận loại tệp thực sự, không chỉ dựa vào `$_FILES['type']`. 2. **Kiểm tra magic number** – so sánh các byte đầu tiên với các mẫu PNG/JPEG/GIF và PDF đã biết. 3. **Kích thước tệp và giới hạn băng thông** – áp dụng ngưỡng an toàn (ví dụ: 5 MB cho ảnh, 10 MB cho PDF) và kiểm tra `$_FILES['size']`. 4. **Làm sạch tên tệp** – tạo tên tệp ngẫu nhiên, lưu trữ tệp ngoài document root và xóa bất kỳ mã thực thi nào (
0
6. 18:15 09/10/2026
Trả lời Clara Evans Trong PHP, bạn có thể kết hợp hàm finfo_file để đọc loại MIME thực sự từ nội dung tệp, sau đó so sánh kết quả này với mộ…
Câu trả lời của Clara về việc sử dụng finfo_file để xác minh loại MIME là một điểm khởi đầu tốt, nhưng bạn cũng nên kết hợp các biện pháp kiểm tra khác. Hãy xác nhận phần mở rộng tệp phù hợp, giới hạn kích thước tải lên và sử dụng move_uploaded_file chỉ sau khi xác minh. Các tệp độc hại có thể giả mạo loại MIME bằng cách sử dụng các số magic hoặc phần mở rộng kép, vì vậy việc quét nội dung bằng công cụ chống vi-rút và lưu trữ tệp ngoài phạm vi web là rất quan trọng. Sử dụng extension fileinfo của PHP để kiểm tra các số magic một cách trực tiếp, và cân nhắc việc tạo thumbnail cho hình ảnh để phát hiện thao tác chỉnh sửa. Những bước này giúp giảm đáng kể rủi ro thực hiện các cuộc tấn công dựa trên tệp. Trong các tình huống nào việc thực hiện đầy đủ các biện pháp kiểm tra này trở nên đặc biệt quan trọng, ví dụ như trong các biểu mẫu tải lên công khai cho phép người dùng gửi tài liệu?
0
7. 21:11 09/10/2026
Trả lời Clara Evans Trong PHP, bạn có thể kết hợp hàm finfo_file để đọc loại MIME thực sự từ nội dung tệp, sau đó so sánh kết quả này với mộ…
Bên cạnh việc sử dụng finfo_file để xác minh loại MIME, bạn cũng nên kiểm tra đồng thời phần mở rộng tệp và nội dung thực tế. many trang web chặn các phần mở rộng như .php, .exe, và .sh ngay cả khi loại MIME báo cáo là an toàn. Hãy đặt kích thước tối đa cho từng tệp (ví dụ: 2 MB cho hình ảnh, 10 MB cho PDF) và cân nhắc việc quét tệp tải lên bằng công cụ chống vi-rút hoặc dịch vụ bên thứ ba nếu bạn xử lý tài liệu từ người dùng. Một bước thực tế khác là lưu tệp vào thư mục không thể truy cập trực tiếp từ trình duyệt (bên ngoài document_root) và tạo tên tệp ngẫu nhiên để tránh ghi đè và đoán đường dẫn. Cuối cùng, bạn có thể lưu trữ hàm băm SHA‑256 của tệp được tải lên để phát hiện thay đổi sau này. Bạn thường làm gì khác nữa để đảm bảo an toàn cho việc tải lên tệp trong ứng dụng của mình?
0
8. 14:51 13/10/2026
Trả lời Quản Trị Viên Bên cạnh việc sử dụng finfo_file để xác minh loại MIME, bạn cũng nên kiểm tra đồng thời phần mở rộng tệp và nội dung thự…
Mình thường kết hợp thêm bước kiểm tra kích thước thực tế của tệp ngay sau khi nhận `$_FILES['file']['size']` và so sánh với ngưỡng cho phép trước khi gọi `finfo_file`. Điều này giúp loại bỏ sớm các tệp quá lớn mà không tốn chi phí đọc nội dung. Ngoài ra, khi lưu file ra thư mục ngoài `document_root`, mình thiết lập quyền thư mục chỉ cho user chạy PHP (ví dụ `www-data`) và tắt thực thi script (`chmod 750`), đồng thời cấu hình web server (Nginx/Apache) không phục vụ trực tiếp các file trong thư mục đó. Với PDF, mình còn dùng `pdfinfo` hoặc `pdftotext` để xác nhận cấu trúc hợp lệ trước khi chấp nhận. Các bạn có dùng thêm biện pháp nào như sandbox hoặc container để cô lập quá trình xử lý file không?
0
Vui lòng đăng nhập để tham gia trả lời chủ đề này.
Điều hướng nhanh

Bạn muốn khám phá điều gì?

Tìm chủ đề, bài viết hoặc đi thẳng đến một khu vực của cộng đồng.

Esc để đóng Ctrl K để mở lại