Làm cách nào để kiểm tra loại tệp trong PHP?

Kiểm tra loại tệp bằng cách sử dụng $_FILES['upload']['type'] không phải là cách đáng tin cậy. Nó trả về loại mime dựa trên phần mở rộng tệp, ví dụ: nếu phần mở rộng tệp là png thì nó trả về 'hình ảnh/png' và nếu phần mở rộng tệp là txt thì nó trả về 'văn bản/thuần túy'

Trong ví dụ trên, chúng tôi đang sử dụng hàm mime_content_type để tải loại nội dung thực tế của một tệp (từ ma thuật. mime trên máy chủ PHP của bạn) bất kể phần mở rộng của nó là gì

Ví dụ. Tạo một hàm để xác thực loại tệp mime

Kiểm tra phần mở rộng tập tin

Để xác định xem một tệp có khả năng không an toàn hay không, bạn cần giải nén phần mở rộng tên tệp. Bạn có thể làm điều đó với chức năng pathinfo()

 /usr/etc
    [basename] => info.inc.php
    [extension] => php
    [filename] => info.inc
)*/

Hàm PHP pathinfo() trả về thông tin về đường dẫn tệp (bao gồm cả phần mở rộng tệp). Theo mặc định, nó trả về một mảng kết hợp với các khóa sau

Cách kiểm tra loại tệp trong PHP và tải lên tệp an toàn. điều quan trọng là phải xác thực các loại MIME trong PHP. Đặc biệt là các tệp được tải lên thông qua biểu mẫu tải lên trang web của bạn. Sử dụng PHP, cách tốt nhất để xác thực các loại MIME là sử dụng tiện ích mở rộng PHP Fileinfo. Bất kỳ phương pháp nào khác có thể không tốt hoặc an toàn như bạn nghĩ…

Mục lục

Xác thực đầu vào tệp PHP, Cách cũ^Sai

Việc chỉ nhìn vào phần mở rộng của tệp là khá phổ biến để xác định loại tệp đó là gì (tôi đã hy vọng nói “nhiều năm trước”, nhưng thật không may, tôi vẫn thấy điều này một cách thường xuyên…)

Một hình ảnh luôn có một phần mở rộng như. jpg,. jpeg,. png hoặc. gif phải không? . pdf dưới dạng phần mở rộng. Ồ, chúng tôi đã sai

Để xác thực phần mở rộng của tệp, chúng tôi thường sử dụng thứ gì đó trong dòng

if(eregi("\.jpg|\.jpeg|\.gif|\.png|\.bmp", $_FILES['userfile']['name']) != FALSE) { // do stuff // some more ... }

Code language: PHP (php)

và dù ví dụ này sử dụng ereg, eregi hay preg_match cũng không quan trọng. Thấy đuôi mở rộng như jpg, jpeg, gif, png hay bmp chắc chỉ toàn ảnh thôi đúng không?

Một số người trong chúng tôi có thể mở rộng xác thực các tệp được tải lên PHP bằng một kiểm tra bổ sung

Xác thực tệp PHP, Cách tốt hơn để xác thực các loại MIME, nhưng chỉ dành cho hình ảnh

Cách tốt hơn để xác thực các loại MIME trong PHP là

$imageInfo = getimagesize( $_FILES['userfile']['tmp_name'] ); if ($imageInfo['mime'] == ("image/png") || $imageInfo['mime'] == ("image/jpeg") || $imageInfo['mime'] == ("image/gif") || $imageInfo['mime'] == ("image/psd") || $imageInfo['mime'] == ("image/bmp")) {

Code language: PHP (php)

Lần kiểm tra cuối cùng này sử dụng một hàm hình ảnh PHP được gọi là getimagesize(). Vì vậy, điều này chỉ hoạt động trên hình ảnh

Hàm getimagesize() sẽ xác định kích thước của bất kỳ tệp hình ảnh cụ thể nào và trả về kích thước cùng với loại tệp và chuỗi văn bản chiều cao/chiều rộng được sử dụng bên trong thẻ IMG HTML thông thường và loại nội dung HTTP tương ứng

Nhưng getimagesize() chỉ hoạt động với hình ảnh và không hoạt động trên các loại tệp khác. Do đó, rất nhiều nhà phát triển sử dụng (hy vọng là đã từng sử dụng?) mime_content_type()

Chà, hãy để chức năng đó không được dùng nữa để ủng hộ tiện ích mở rộng PECL Fileinfo. Và đến lượt nó, tiện ích mở rộng Fileinfo của PECL hiện không được dùng nữa để thay thế cho tiện ích mở rộng Fileinfo của PHP. Bạn vẫn có thể làm theo?

Vì vậy, tốt nhất là sử dụng tiện ích mở rộng Fileinfo của PHP, vì nó cũng hoạt động với các loại tệp khác ngoài hình ảnh

Tiện ích mở rộng thông tin tệp PHP. xác thực các loại MIME và tải lên tệp an toàn trong PHP

Để xác thực đúng kiểu MIME trong PHP, để cung cấp một số loại bảo mật tải lên tệp, bạn cần sử dụng các hàm PHP Fileinfo. Điều này có thể xác thực các loại MIME của Office và các loại khác

Một hàm PHP ví dụ để xác thực các loại MIME Office và PDF là

/* * Follow me on Twitter: @Jan_Reilink, https://twitter.com/hertogjanr */ function check_doc_mime( $tmpname ) { // MIME types: http://filext.com/faq/office_mime_types.php $finfo = finfo_open( FILEINFO_MIME_TYPE ); $mtype = finfo_file( $finfo, $tmpname ); finfo_close( $finfo ); if( $mtype == ( "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ) || $mtype == ( "application/vnd.ms-excel" ) || $mtype == ( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) || $mtype == ( "application/vnd.ms-powerpoint" ) || $mtype == ( "application/vnd.openxmlformats-officedocument.presentationml.presentation" ) || $mtype == ( "application/pdf" ) ) { return TRUE; } else { return FALSE; } } if( function_exists( "check_doc_mime" ) ) { if ( !check_doc_mime( $_FILES['userfile']['tmp_name'] ) ) { /* * Not a MIME type we want uploaded to our site, stop here * and return an error message, or just die(); */ } else { /* * a MIME type we support is uploaded. Continue with our * upload script */ } } /* Support https://www.paypal.me/jreilink , thank you! */ ?>

Code language: PHP (php)

Chức năng này có thể được sử dụng để xác minh loại tệp MIME được tải lên qua HTTP

$imageInfo = getimagesize( $_FILES['userfile']['tmp_name'] ); if ($imageInfo['mime'] == ("image/png") || $imageInfo['mime'] == ("image/jpeg") || $imageInfo['mime'] == ("image/gif") || $imageInfo['mime'] == ("image/psd") || $imageInfo['mime'] == ("image/bmp")) {

Code language: PHP (php)
0. Xác thực đầu vào của người dùng phù hợp rất quan trọng đối với bảo mật trang web của bạn

Làm cách nào để tìm loại tệp trong PHP?

Hàm filetype() trả về loại tệp của một tệp.

Làm cách nào để lấy loại tệp từ URL trong PHP?

Cách đơn giản nhất để lấy phần mở rộng tệp trong PHP là sử dụng hàm có sẵn của PHP pathinfo .

Làm cách nào để kiểm tra phần mở rộng tệp trong PHP?

php //checks file extension for images only $allowed = array('gif','png' ,'jpg'); $file = $_FILES['file']['name']; $ext = pathinfo($file, PATHINFO_EXTENSION); if(! in_array($ext,$allowed) ) { //?>