1. 程式人生 > >[PHP] 檔案上傳過程中基於白名單、黑名單、基於MIME的認證以及目錄認證

[PHP] 檔案上傳過程中基於白名單、黑名單、基於MIME的認證以及目錄認證

1.基於黑名單

<?php
	$BlackList = array('asp','php','jsp','php5','asa','aspx');//黑名單
	if (isset($_POST["submit"])){
		$name = $_FILES['file']['name']; //接收檔名
		echo $name;
		$extension = substr(strrchr($name,"."),1);//得到副檔名
		$boo = false;
		
		foreach ($BlackList as $key=>$value){
			if ($value==$extension){//迭代判斷是否有命中
				$boo=true;
				break;//命中之後直接退出迴圈
			}
		}
		
		if(!$boo){//如果沒有命中,則開始檔案上傳操作
			$size=$_FILES['file']['size'];//接收檔案大小
			$tmp=$_FILES['file']['tmp_name'];//臨時路徑
			move_uploaded_file($tmp,$name);//移動臨時檔案到當前檔案目錄
			echo "檔案上傳成功!<br/> path:".$name;
		}else {
			echo "檔案不合法!!";
		}
		
	}
?>

2.基於白名單
<?php
	$WhiteList = array('rar','jpg','png','bmp','gif','jpg','doc');
	if (isset($_POST["submit"])){
		$name = $_FILES['file']['name']; //接收檔名
		$extension = substr(strrchr($name,"."),1);//得到副檔名
		$boo = false;
		
		foreach ($WhiteList as $key=>$value){
			if ($value==$extension){//迭代判斷是否有命中
				$boo=true;
			}
		}
		
		if($boo){//如果有命中,則開始檔案上傳操作
			$size=$_FILES['file']['size'];//接收檔案大小
			$tmp=$_FILES['file']['tmp_name'];//臨時路徑
			move_uploaded_file($tmp,$name);//移動臨時檔案到當前檔案目錄
			echo "檔案上傳成功!<br/> path:".$name;
		}else {
			echo "檔案不合法!!";
		}		
	}
?>

3.基於MIME
<?
if ($_FILE['file']['type']=="image/jpeg"){//判斷是否是JPG格式
	$imageTempName=$_FILES['file']['tmp_name'];
	$imageName=$_FILES['file']['name'];
	$last = substr($imageName,strrpos($imageName,"."));
	if(!is_dir("uploadFile"))
		mkdir("uploadFile");
	}
	$imageName=md5($imageName).$last;
	move_uploaded_file($imageTempName,"./uploadFile".$imageName);//指定檔案上傳到uploadFile目錄
	echo ("檔案上傳成功!! path=/uploadFile/$imageName");
	}
else{
	echo ("檔案型別錯誤,請重新上傳...");
	exit();
	}
?>

4.目錄認證

前端:

<form action="upload.php" method="post" enctype="multipart/form-data">
	<input type="file" name="file"/><br/>
	<input type="file" name="Extension" value="up"/>
	<input type="submit" value="提交" name="submit" />
</form>
後端:
<?php
if($_FILES['file']['type']=="image/jpeg"){ //判斷是否是JPG格式
	$imageTempName=$_FILES['file']['tmp_name']; //接受檔案路徑
	$imageName=$_FILES['file']['name']; //接收檔名稱
	$last=substr($imageName,strrpos($imageName,"."));//取得副檔名
	if($last!=".jpg"){
		exit("圖片型別錯誤!");
	}
	$Extension=$_POST["Extension"];
	if(!is_dir($Extension)){
		mkdir($Extension);
	}
	$imageName=md5($imageName).$last;
	move_uploaded_file($imageTempName,"./Extension/".$imageName);
	echo("檔案上傳成功!! path= /$Extension/$imageName");
}
else{
	echo("檔案型別錯誤,請重新上傳。。。");
	exit();
}
?>