2013-03-24 22 views
5

tôi sử dụng var_dump(@$_FILES['file']['type']) để kiểm tra loại tập tin Tôi đã tải lên

Trước tiên, tôi tải lên một exe file gọi là "uninstall.exe", và nó trở

"string 'application/octet-stream' (length=24)" 

Sau đó, tôi đổi tên tập tin này để uninstall.png, nó trở

string 'image/png' (length=9) 

kết luận của tôi là: $ _FILES [ 'file'] [ 'type'] chỉ che phần mở rộng tệp ck, không phải là loại tệp gốc.

Các mã sau đây là từ w3cschool:

$allowedExts = array("gif", "jpeg", "jpg", "png"); 
$extension = end(explode(".", $_FILES["file"]["name"])); 
if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/jpg") 
|| ($_FILES["file"]["type"] == "image/png")) 
&& ($_FILES["file"]["size"] < 20000) 
&& in_array($extension, $allowedExts)) 

Tôi nghĩ $_FILES["file"]["type"] trong mã trên là không cần thiết, chúng tôi chỉ có thể kiểm tra phần mở rộng tập tin sử dụng explode()in_array

Tôi chỉ là một người mới bắt đầu php, ai đó có thể xác nhận ý tưởng của tôi? Cảm ơn!

+1

Có, tôi tin rằng nhiều người trong chúng ta biết rằng loại tệp có thể bị giả mạo. – Class

+4

Một bài học không sử dụng w3schools – SomeShinyObject

+1

Cảm ơn, tôi rất vui vì tôi đã tìm thấy điều gì đó sai trong w3cschool – nut

Trả lời

5

Bạn hoàn toàn chính xác. Loại MIME được cung cấp bởi khách hàng và bạn không thể đảm bảo rằng nó là cor ­ rect. Đối với vấn đề đó, do đó, là phần mở rộng tập tin. Nếu bạn cần phải hoàn toàn chắc chắn, bạn cần phải xem nội dung tập tin.

+0

Tôi rất vui vì ý tưởng của tôi đã được xác nhận, ai đó đã nói: "phần mở rộng của tệp và" loại tệp "có thể khác nhau, vì vậy ai đó không thể tải lên tệp thi hành có đuôi .png với $ _FILES [" tệp "] [" "]." Tôi nghĩ rằng anh ấy sai – nut

+0

@ user1970939: Vâng, một người nào đó thực sự có thể cung cấp một tệp có tên 'file.exe' với một loại MIME là' image/png'. Cả hai đều do khách hàng cung cấp và không bắt buộc phải nhất quán. – icktoofay

7

Nếu bạn muốn đảm bảo rằng hình ảnh đã được tải lên, hãy sử dụng getimagesize, trả về 0 cho hình ảnh không phải.

+0

và một số JPEG ngay cả. Hầu hết các ảnh JPEG đến từ máy ảnh kỹ thuật số. –

+0

cảm ơn đã đề cập đến getimagesize – nut

+0

@darthmaim hoàn toàn không chính xác! 'getimagesize' có thể và sẽ trả về thành công cho một số hình ảnh không phải. Xem [tại đây] (http://php.net/manual/en/function.getimagesize.php) – JDrake

1

Bạn nên sử dụng trình bao bọc của tiện ích mở rộng GD hoặc Imagick. Một cái rất tốt là WideImage.

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