• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-23) 14次浏览 已收录 0个评论

在使用 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:请重试';			exit();		}	}else{		$_FILES ['userfile'] ['error'] = 6;	}	if ($_FILES ['userfile'] ['error'] > 0) {		echo 'Problem: ';		switch ($_FILES ['userfile'] ['error']) {			case 1 :				echo '上传文件过大:请重试';				break;			case 2 :				echo '上传文件过大:请重试';				break;			case 3 :				echo '文件上传丢失:请重试';				break;			case 4 :				echo '无文件被上传:请重试';				break;			case 6 :				echo '仅支持word和pdf文件,且文件大小小于512kb:请重试';				break;			case 7 :				echo '上传文件存储失败:请重试';				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;<div>本文#来源gaodai.ma#com搞##代!^码7网</div><pre>搞代gaodaima码

} return $extType;}


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php判断上传文件文件类型的安全方法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址