1. 程式人生 > >PHP-上傳文件

PHP-上傳文件

ech 進行 找不到 shell use cut cas 過濾 null

php.ini中和和文件上傳相關的選項

指令名 默認值 描述
file_uploads ON 服務器上的php腳本是否可以接受文件上傳
max_execution_time 30 PHP腳本在註冊一個致命錯誤之前可以執行的最長時間,以秒為單位
memory_limit 128MB 設置PHP腳本可以分配到的最大內存,以MB為單位,這樣可以防止失控的腳本獨占服務器內存
upload_max_filesize 2MB 設置上傳文件的大小的最大值,以MB為單位。此指令必須小於post_max_size
upload_tmp_dir NULL 設置文件上傳後存放的臨時目錄
post_max_size 8M 通過POST方式發送信息的大小,以MB為單位

用來上傳文件的php腳本

<form enctype="multipart/form-data" action="upload.php" method="post">
	<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
	上傳文件:<input type="file" name="userfile" />
	<input type="submit" value="上傳" />
</form>

POST方式發送文件到upload.php進行處理

技術分享圖片

選擇本地的一個shell.jpg文件

upload.php中的內容

<?php 

	//打印文件信息的數組
	print_r($_FILES);

?>

點擊上傳

技術分享圖片

全局數組$_FILES中的元素說明

數組 描述
$_FILES[‘userfile‘][‘name‘] 上傳的文件的文件名
$_FILES[‘userfile‘][‘type‘] 上傳的文件的文件類型
$_FILES[‘userfile‘][‘tmp_name‘] 上傳的文件臨時存放地址
$_FILES[‘userfile‘][‘error‘] 上傳的文件的錯誤類型
$_FILES[‘userfile‘][‘size‘] 上傳的文件的大小

對上傳的文件進行過濾和處理

<?php 

	//允許上傳的文件類型
	$allow_type = [‘image/jpeg‘, ‘image/png‘, ‘image/pjpeg‘, ‘image/x-png‘, ‘image/gif‘];
	//判斷上傳的類型是否被允許
	if (!in_array($_FILES[‘userfile‘][‘type‘], $allow_type)){
		echo "<script>alert(‘只允許上傳jpg/png/gif類型的圖片‘)</script>";
		exit;
	}


	//判斷上傳過程中是否發生錯誤
	if ($_FILES[‘userfile‘][‘error‘] != 0){
		switch ($_FILES[‘userfile‘][‘error‘]) {
			case 1:
			echo "<script>alert(‘上傳文件的大小超過了php.ini中upload_max_filesize的約定值‘)</script>";
			break;
		case 2:
			echo "<script>alert(‘上傳文件的大小超過了上傳表單max_file_size規定的最大值‘)</script>";
			break;
		case 3:
			echo "<script>alert(‘文件只被部分上傳‘)</script>";
			break;
		case 4:
			echo "<script>alert(‘文件沒有被上傳‘)</script>";
			break;
		}
		exit;
	}


	//用來再次判斷上傳文件的大小
	define(‘MAX_SIZE‘, 2000000);
	if ($_FILES[‘userfile‘][‘size‘] > MAX_SIZE){
		echo "<script>alert(‘上傳的文件大小不能超過2M‘)</script>";
		exit;
	}


	//判斷目錄是否存在
	define(‘URL‘, dirname(__FILE__).‘\files‘);
	if (!is_dir(URL)) {
		mkdir(URL);
	}

	//把文件從臨時文件夾移動到指定文件夾
	if (is_uploaded_file($_FILES[‘userfile‘][‘tmp_name‘])){
		if (!@move_uploaded_file($_FILES[‘userfile‘][‘tmp_name‘], URL.‘/‘.$_FILES[‘userfile‘][‘name‘])){
			echo "<script>alert(‘移動失敗‘);history.back();</script>";
			exit;
		}
	}else {
		echo "<script>alert(‘臨時文件夾找不到文件‘);history.back();</script>";
		exit;
	}


	//經過以上過濾,符合條件的文件上傳成功,執行以下語句
	echo "<script>alert(‘文件上傳成功‘);location.href=‘url.php?url=files/".$_FILES[‘userfile‘][‘name‘]."‘".";</script>";

?>

上傳文件

技術分享圖片

然後跳轉到http://127.0.0.1/upload/url.php?url=files/shell.jpg

技術分享圖片

PHP-上傳文件