Rumah pembangunan bahagian belakang tutorial php php判断上传文件文件类型的安全方法

php判断上传文件文件类型的安全方法

Jun 20, 2016 pm 01:01 PM
Muat naik fail

在使用 php 进行文件的上传和存储时,很多人都会给文件进行重名命并保存到可写文件夹下,然后我们在其中一个失误的地方便是采用上传文件的扩展名作为判断文件类型的依据。

这样做其实与后门大开无异,举一个简单的例子,通过扩展名判断一般是字符串的截取判断,或者是使用$_FILE数组判断,然后如果用户上传的文件名为 image.php.png, image.png.php, image.php%****.png 之类的话,判断就会出错。

另外,$_FILES['type']可能被篡改。

下面是我判断文件名的方法:

读取文件头四个字节作为判断。         

下面直接上代码

我实现的是仅支持word和pdf文件,且文件大小小于512kb:

	$tmpname = $_FILES ['userfile'] ['tmp_name'];
	if(is_uploaded_file($tmpname)) {
		$mimetype = detectMIME($tmpname);
		$tuozhanming = getFileExt($filename, $mimetype);
		if($tuozhanming == "type_error"){
			echo '仅支持word和pdf文件,且文件大小小于512kb:<a href=".%24reurl.">请重试</a>';
			exit();
		}
	}else{
		$_FILES ['userfile'] ['error'] = 6;
	}

	if ($_FILES ['userfile'] ['error'] > 0) {
		echo 'Problem: ';
		switch ($_FILES ['userfile'] ['error']) {
			case 1 :
				echo '上传文件过大:<a href=".%24reurl.">请重试</a>';
				break;
			case 2 :
				echo '上传文件过大:<a href=".%24reurl.">请重试</a>';
				break;
			case 3 :
				echo '文件上传丢失:<a href=".%24reurl.">请重试</a>';
				break;
			case 4 :
				echo '无文件被上传:<a href=".%24reurl.">请重试</a>';
				break;
			case 6 :
				echo '仅支持word和pdf文件,且文件大小小于512kb:<a href=".%24reurl.">请重试</a>';
				break;
			case 7 :
				echo '上传文件存储失败:<a href=".%24reurl.">请重试</a>';
				break;
		}
		exit ();
	}
	//判断文件类型
	//上传文件 
	$_FILES ['userfile'] ['name'] = time () . "." . $tuozhanming;
	$upfile = '../uploads/' . $_FILES ['userfile'] ['name'];

	if ( !move_uploaded_file ( $_FILES ['userfile'] ['tmp_name'], $upfile )) {
		echo 'Problem: 文件移动失败';
		exit ();
	}
	
}

function detectMIME($filename) {
	$file = fopen ( $filename, "rb" );
	$finfo = finfo_open ( FILEINFO_MIME );
	if (! $finfo) {
		// 直接读取文件的前4个字节,根据硬编码判断
		$file = fopen ( $filename, "rb" );
		$bin = fread ( $file, 4 ); //只读文件头4字节
		fclose ( $file );
		$strInfo = @unpack ( "C4chars", $bin );
		//dechex() 函数把十进制转换为十六进制。
		$typeCode = dechex ( $strInfo ['chars1'] ) . 
                            dechex ( $strInfo ['chars2'] ) . 
                            dechex ( $strInfo ['chars3'] ) . 
                            dechex ( $strInfo ['chars4'] );
		$type = '';
		switch ($typeCode) //硬编码值查表
		{
			case "504b34" :
				$type = 'application/zip; charset=binary';
				break;
			case "d0cf11e0" :
				$type = 'application/vnd.ms-office; charset=binary';
				break;
			case "25504446" :
				$type = 'application/pdf; charset=binary';
				break;
			default :
				$type = 'application/vnd.ms-office; charset=binary';
				break;
		}
	} else {
		//finfo_file return information of a file
		$type = finfo_file ( $finfo, $filename );
	}
	return $type;

function getFileExt($filename, $type) {
	switch ($type) {
		case "application/zip; charset=binary" :
			$extType = "docx";
			break;
		case "application/vnd.ms-office; charset=binary" :
			$extType = "doc";
			break;
		case "application/msword; charset=binary" :
    			$extType = "doc";
   			break;
		case "application/pdf; charset=binary" :
			$extType = "pdf";
			break;
		default :
			$extType = "type_error";
			break;
	}
	return $extType;
}
Salin selepas log masuk

 


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Laksanakan muat naik dan muat turun fail dalam dokumen Workerman Laksanakan muat naik dan muat turun fail dalam dokumen Workerman Nov 08, 2023 pm 06:02 PM

Untuk melaksanakan muat naik dan muat turun fail dalam dokumen Workerman, contoh kod khusus diperlukan. Pengenalan: Workerman ialah rangka kerja komunikasi rangkaian tak segerak PHP berprestasi tinggi yang ringkas, cekap dan mudah digunakan. Dalam pembangunan sebenar, muat naik dan muat turun fail adalah keperluan fungsi biasa Artikel ini akan memperkenalkan cara menggunakan rangka kerja Workerman untuk melaksanakan muat naik dan muat turun fail, dan memberikan contoh kod khusus. 1. Muat naik fail: Muat naik fail merujuk kepada operasi memindahkan fail pada komputer tempatan ke pelayan. Yang berikut digunakan

Cara menggunakan Laravel untuk melaksanakan fungsi muat naik dan muat turun fail Cara menggunakan Laravel untuk melaksanakan fungsi muat naik dan muat turun fail Nov 02, 2023 pm 04:36 PM

Cara menggunakan Laravel untuk melaksanakan fungsi muat naik dan muat turun fail Laravel ialah rangka kerja Web PHP popular yang menyediakan pelbagai fungsi dan alatan untuk menjadikan pembangunan aplikasi Web lebih mudah dan cekap. Salah satu fungsi yang biasa digunakan ialah muat naik dan muat turun fail. Artikel ini akan memperkenalkan cara menggunakan Laravel untuk melaksanakan fungsi muat naik dan muat turun fail, serta menyediakan contoh kod khusus. Muat naik fail Muat naik fail merujuk kepada memuat naik fail tempatan ke pelayan untuk penyimpanan. Dalam Laravel kita boleh menggunakan muat naik fail

Bagaimana untuk menyelesaikan pengecualian muat naik fail Java (FileUploadException) Bagaimana untuk menyelesaikan pengecualian muat naik fail Java (FileUploadException) Aug 18, 2023 pm 12:11 PM

Cara menyelesaikan pengecualian muat naik fail Java (FileUploadException Satu masalah yang sering dihadapi dalam pembangunan web ialah FileUploadException (pengecualian muat naik fail). Ia mungkin berlaku disebabkan oleh pelbagai sebab seperti saiz fail melebihi had, format fail tidak sepadan atau konfigurasi pelayan yang salah. Artikel ini menerangkan beberapa cara untuk menyelesaikan masalah ini dan menyediakan contoh kod yang sepadan. Hadkan saiz fail yang dimuat naik Dalam kebanyakan senario, hadkan saiz fail

Bagaimana untuk menggunakan gRPC untuk melaksanakan muat naik fail di Golang? Bagaimana untuk menggunakan gRPC untuk melaksanakan muat naik fail di Golang? Jun 03, 2024 pm 04:54 PM

Bagaimana untuk melaksanakan muat naik fail menggunakan gRPC? Buat definisi perkhidmatan sokongan, termasuk permintaan dan mesej respons. Pada klien, fail yang hendak dimuat naik dibuka dan dibahagikan kepada beberapa bahagian, kemudian distrim ke pelayan melalui aliran gRPC. Di bahagian pelayan, ketulan fail diterima dan disimpan ke dalam fail. Pelayan menghantar respons selepas muat naik fail selesai untuk menunjukkan sama ada muat naik berjaya.

Bagaimana untuk melaksanakan bar kemajuan muat naik fail FTP menggunakan PHP Bagaimana untuk melaksanakan bar kemajuan muat naik fail FTP menggunakan PHP Jul 30, 2023 pm 06:51 PM

Cara menggunakan PHP untuk melaksanakan bar kemajuan muat naik fail FTP 1. Pengenalan latar belakang Dalam pembangunan laman web, muat naik fail adalah fungsi biasa. Untuk muat naik fail besar, untuk meningkatkan pengalaman pengguna, kami selalunya perlu memaparkan bar kemajuan muat naik kepada pengguna untuk memberitahu pengguna proses muat naik fail. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melaksanakan fungsi bar kemajuan muat naik fail FTP. 2. Idea asas untuk melaksanakan bar kemajuan muat naik fail FTP Bar kemajuan muat naik fail FTP biasanya dikira dengan mengira saiz fail yang dimuat naik dan saiz fail yang dimuat naik.

Memuat Naik dan Memproses Fail dalam Laravel: Mengurus Fail Yang Dimuat Naik Pengguna Memuat Naik dan Memproses Fail dalam Laravel: Mengurus Fail Yang Dimuat Naik Pengguna Aug 13, 2023 pm 06:45 PM

Memuat Naik dan Memproses Fail dalam Laravel: Mengurus Fail Yang Dimuat Naik Pengguna Pengenalan: Muat naik fail ialah keperluan fungsi yang sangat biasa dalam aplikasi web moden. Dalam rangka kerja Laravel, muat naik dan pemprosesan fail menjadi sangat mudah dan cekap. Artikel ini akan memperkenalkan cara mengurus fail yang dimuat naik pengguna dalam Laravel, termasuk pengesahan, penyimpanan, pemprosesan dan paparan muat naik fail. 1. Muat naik fail Muat naik fail merujuk kepada memuat naik fail daripada klien ke pelayan. Dalam Laravel, muat naik fail sangat mudah dikendalikan. pertama,

Panduan muat naik fail PHP: Cara menggunakan fungsi move_uploaded_file untuk mengendalikan fail yang dimuat naik Panduan muat naik fail PHP: Cara menggunakan fungsi move_uploaded_file untuk mengendalikan fail yang dimuat naik Jul 30, 2023 pm 02:03 PM

Panduan muat naik fail PHP: Cara menggunakan fungsi move_uploaded_file untuk mengendalikan fail yang dimuat naik Dalam membangunkan aplikasi web, muat naik fail adalah keperluan biasa. PHP menyediakan fungsi yang mudah move_uploaded_file() untuk memproses fail yang dimuat naik. Artikel ini akan memperkenalkan anda cara menggunakan fungsi ini untuk melaksanakan fungsi muat naik fail. 1. Persediaan Sebelum memulakan, pastikan persekitaran PHP anda telah dikonfigurasikan dengan parameter muat naik fail. Anda boleh melakukannya dengan membuka php.in

Permudahkan pemprosesan muat naik fail dengan fungsi Golang Permudahkan pemprosesan muat naik fail dengan fungsi Golang May 02, 2024 pm 06:45 PM

Jawapan: Ya, Golang menyediakan fungsi yang memudahkan pemprosesan muat naik fail. Butiran: Jenis MultipartFile menyediakan akses kepada metadata dan kandungan fail. Fungsi FormFile mendapat fail tertentu daripada permintaan borang. Fungsi ParseForm dan ParseMultipartForm digunakan untuk menghuraikan data borang dan data borang berbilang bahagian. Menggunakan fungsi ini memudahkan proses pemprosesan fail dan membolehkan pembangun menumpukan pada logik perniagaan.

See all articles