2011-06-23 41 views
7

Ok, tôi cho phép (trong một tập lệnh) cho một số loại tệp nhất định được tải lên thông qua cách tiếp cận do Quản trị viên xác định! Làm cách nào tôi có thể biết các tệp này có thuộc loại mà Quản trị viên đã đặt để đảm bảo chúng không phải là tệp giả hay không. Tôi hiện đang sử dụng phương pháp tiếp cận loại mime, nhưng các trình duyệt khác nhau có thể đặt các loại mime khác nhau, vì vậy điều này không thực sự giúp ích nhiều. Việc kiểm tra phần mở rộng của tệp cũng không giúp ích gì, vì mọi người có thể giải quyết vấn đề này bằng cách cho phép tiện ích mở rộng được phép, nhưng sẽ thuộc loại tệp khác.Làm thế nào để chắc chắn rằng họ đang tải lên các tệp nhất định

Có lẽ có một tham chiếu ở đâu đó về cách kiểm tra các byte trong nhiều loại tệp khác nhau để đảm bảo rằng nó đúng loại? Có lẽ điều này cũng có thể được giả mạo, nhưng ít nhất nó sẽ chính xác hơn một chút khi sử dụng biểu mẫu để tải tệp lên và gửi chúng.

Ai đó có thể giúp tôi với những ý tưởng về điều này không?

Cảm ơn :)

+0

Bạn đang mong đợi loại tệp nào? Tùy thuộc vào tệp, bạn có thể đọc tiêu đề của chúng để xem loại tệp nào. – alex

+0

Vâng, Quản trị viên chọn tệp nào họ muốn được phép tải lên, bằng cách đặt trong phần mở rộng của mỗi tiện ích mở rộng tệp được phân tách bằng dấu phẩy. Vì vậy, bây giờ tôi chỉ cần 'phát nổ (',', $ phần mở rộng)' trên nó và đảm bảo rằng loại tệp là chính xác cho tất cả các phần mở rộng trong mảng đó được trả về. Có cách nào để làm việc này không? Những tập tin nào bạn có thể đọc tiêu đề trên ?? Và những gì các tập tin bạn có thể không đọc tiêu đề trên ?? Bạn có một ý tưởng về một cách tốt hơn để thực hiện điều này mà sẽ là tốt hơn cho an ninh và/hoặc mã khôn ngoan? – SoLoGHoST

+0

Hãy xem ['mime_content_type()'] (http://php.net/manual/en/function.mime-content-type.php). – alex

Trả lời

3

PECL fileinfo (hoặc built-in> 5.3) sẽ kiểm tra chữ ký byte của tập tin để đoán kiểu MIME của họ, vì vậy nó bảo vệ chống lại những người chỉ đơn giản là thay đổi đuôi tệp. Vẫn có thể trong một số trường hợp bao gồm các byte độc ​​hại trong tệp khớp với chữ ký byte thích hợp cho một loại tệp.

Từ các tài liệu PHP:

// Procedural style 
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
echo finfo_file($finfo, $filename); 
finfo_close($finfo); 

// OO style 
$finfo = new finfo(FILEINFO_MIME_TYPE); 
echo $finfo->file($filename); 
$finfo->close(); 

Trên một máy chủ Unix, tôi tin rằng finfo_file() tư vấn cơ sở dữ liệu chữ ký byte tương tự như các tiện ích GNU file.

+0

@Phoenix Tôi nghĩ đó là lần thứ ba trong tuần này bạn đã xóa i10n khỏi một trong các URL tài liệu PHP của tôi. Tôi sẽ nhớ tự mình làm từ bây giờ :) –

+0

Cảm ơn Michael, sẽ thử. – SoLoGHoST

0

Đừng bao giờ tin tưởng đầu vào của người dùng. Không nên sử dụng việc kiểm tra một loại tệp/mimetype nhất định để ngăn mọi người tải nội dung độc hại lên máy chủ của bạn. Nếu mục tiêu là bảo mật máy chủ, thì đơn giản là không cho phép thực thi nội dung trên máy chủ nếu nó được tải lên bởi người dùng. Đối với các tệp mà người khác tải xuống, hãy đảm bảo đặt tuyên bố từ chối trách nhiệm rằng nội dung do người dùng tạo và không được đảm bảo là không có vi-rút.

Các vấn đề liên quan