Maison développement back-end tutoriel php php判断上传文件文件类型的安全方法

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

Jun 20, 2016 pm 01:01 PM
文件上传

在使用 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;
}
Copier après la connexion

 


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Implémenter le téléchargement et le téléchargement de fichiers dans les documents Workerman Implémenter le téléchargement et le téléchargement de fichiers dans les documents Workerman Nov 08, 2023 pm 06:02 PM

Pour implémenter le téléchargement et le téléchargement de fichiers dans des documents Workerman, des exemples de code spécifiques sont requis Introduction : Workerman est un framework de communication réseau asynchrone PHP hautes performances, simple, efficace et facile à utiliser. Dans le développement réel, le téléchargement et le téléchargement de fichiers sont des exigences fonctionnelles courantes. Cet article explique comment utiliser le framework Workerman pour implémenter le téléchargement et le téléchargement de fichiers, et donne des exemples de code spécifiques. 1. Téléchargement de fichiers : le téléchargement de fichiers fait référence à l'opération de transfert de fichiers de l'ordinateur local vers le serveur. Ce qui suit est utilisé

Comment utiliser Laravel pour implémenter les fonctions de téléchargement et de téléchargement de fichiers Comment utiliser Laravel pour implémenter les fonctions de téléchargement et de téléchargement de fichiers Nov 02, 2023 pm 04:36 PM

Comment utiliser Laravel pour implémenter les fonctions de téléchargement et de téléchargement de fichiers Laravel est un framework Web PHP populaire qui fournit une multitude de fonctions et d'outils pour rendre le développement d'applications Web plus facile et plus efficace. L'une des fonctions couramment utilisées est le téléchargement et le téléchargement de fichiers. Cet article expliquera comment utiliser Laravel pour implémenter les fonctions de téléchargement et de téléchargement de fichiers, et fournira des exemples de code spécifiques. Téléchargement de fichiers Le téléchargement de fichiers fait référence au téléchargement de fichiers locaux sur le serveur pour le stockage. Dans Laravel, nous pouvons utiliser le téléchargement de fichiers

Comment résoudre l'exception de téléchargement de fichiers Java (FileUploadException) Comment résoudre l'exception de téléchargement de fichiers Java (FileUploadException) Aug 18, 2023 pm 12:11 PM

Comment résoudre l'exception de téléchargement de fichiers Java (FileUploadException). Un problème souvent rencontré dans le développement Web est FileUploadException (exception de téléchargement de fichiers). Cela peut se produire pour diverses raisons telles qu'une taille de fichier dépassant la limite, une incompatibilité de format de fichier ou une configuration incorrecte du serveur. Cet article décrit quelques méthodes pour résoudre ces problèmes et fournit des exemples de code correspondants. Limiter la taille des fichiers téléchargés Dans la plupart des scénarios, limitez la taille du fichier

Comment utiliser gRPC pour implémenter le téléchargement de fichiers dans Golang ? Comment utiliser gRPC pour implémenter le téléchargement de fichiers dans Golang ? Jun 03, 2024 pm 04:54 PM

Comment implémenter le téléchargement de fichiers à l'aide de gRPC ? Créez des définitions de service de support, y compris des messages de demande et de réponse. Sur le client, le fichier à télécharger est ouvert et divisé en morceaux, puis diffusé sur le serveur via un flux gRPC. Côté serveur, des fragments de fichiers sont reçus et stockés dans un fichier. Le serveur envoie une réponse une fois le téléchargement du fichier terminé pour indiquer si le téléchargement a réussi.

Comment implémenter la barre de progression du téléchargement de fichiers FTP en utilisant PHP Comment implémenter la barre de progression du téléchargement de fichiers FTP en utilisant PHP Jul 30, 2023 pm 06:51 PM

Comment utiliser PHP pour implémenter la barre de progression du téléchargement de fichiers FTP 1. Introduction générale Dans le développement de sites Web, le téléchargement de fichiers est une fonction courante. Pour le téléchargement de fichiers volumineux, afin d'améliorer l'expérience utilisateur, nous devons souvent afficher une barre de progression du téléchargement à l'utilisateur pour l'informer du processus de téléchargement du fichier. Cet article explique comment utiliser PHP pour implémenter la fonction de barre de progression du téléchargement de fichiers FTP. 2. L'idée de base de la mise en œuvre de la barre de progression du téléchargement de fichiers FTP est généralement calculée en calculant la taille du fichier téléchargé et la taille du fichier téléchargé.

Téléchargement et traitement de fichiers dans Laravel : gestion des fichiers téléchargés par les utilisateurs Téléchargement et traitement de fichiers dans Laravel : gestion des fichiers téléchargés par les utilisateurs Aug 13, 2023 pm 06:45 PM

Téléchargement et traitement de fichiers dans Laravel : gestion des fichiers téléchargés par les utilisateurs Introduction : Le téléchargement de fichiers est une exigence fonctionnelle très courante dans les applications Web modernes. Dans le framework Laravel, le téléchargement et le traitement de fichiers deviennent très simples et efficaces. Cet article explique comment gérer les fichiers téléchargés par les utilisateurs dans Laravel, y compris la vérification, le stockage, le traitement et l'affichage des téléchargements de fichiers. 1. Téléchargement de fichiers Le téléchargement de fichiers fait référence au téléchargement de fichiers du client vers le serveur. Dans Laravel, les téléchargements de fichiers sont très simples à gérer. d'abord,

Guide de téléchargement de fichiers PHP : Comment utiliser la fonction move_uploaded_file pour gérer les fichiers téléchargés Guide de téléchargement de fichiers PHP : Comment utiliser la fonction move_uploaded_file pour gérer les fichiers téléchargés Jul 30, 2023 pm 02:03 PM

Guide de téléchargement de fichiers PHP : Comment utiliser la fonction move_uploaded_file pour gérer les fichiers téléchargés Dans le développement d'applications Web, le téléchargement de fichiers est une exigence courante. PHP fournit une fonction pratique move_uploaded_file() pour traiter les fichiers téléchargés. Cet article vous présentera comment utiliser cette fonction pour implémenter la fonction de téléchargement de fichiers. 1. Préparation Avant de commencer, assurez-vous que votre environnement PHP a été configuré avec les paramètres de téléchargement de fichiers. Vous pouvez le faire en ouvrant php.in

Simplifiez le traitement du téléchargement de fichiers avec les fonctions Golang Simplifiez le traitement du téléchargement de fichiers avec les fonctions Golang May 02, 2024 pm 06:45 PM

Réponse : Oui, Golang fournit des fonctions qui simplifient le traitement du téléchargement de fichiers. Détails : le type MultipartFile permet d'accéder aux métadonnées et au contenu des fichiers. La fonction FormFile obtient un fichier spécifique à partir de la demande de formulaire. Les fonctions ParseForm et ParseMultipartForm sont utilisées pour analyser les données de formulaire et les données de formulaire en plusieurs parties. L'utilisation de ces fonctions simplifie le processus de traitement des fichiers et permet aux développeurs de se concentrer sur la logique métier.

See all articles