php判断上传文件文件类型的安全方法
在使用 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; }

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

实现Workerman文档中的文件上传与下载,需要具体代码示例引言:Workerman是一款高性能的PHP异步网络通讯框架,具备简洁、高效、易用等特点。在实际开发中,文件上传和下载是常见的功能需求,本文将介绍如何使用Workerman框架实现文件的上传和下载,并给出具体的代码示例。一、文件上传:文件上传是指将本地计算机上的文件传输至服务器端的操作。下面是使用

如何利用Laravel实现文件上传和下载功能Laravel是一个流行的PHPWeb框架,提供了丰富的功能和工具,使得开发Web应用程序更加简单和高效。其中一个常用的功能就是文件上传和下载。本文将介绍如何利用Laravel实现文件上传和下载功能,并提供具体的代码示例。文件上传文件上传是指将本地的文件上传到服务器上保存。在Laravel中,我们可以使用文件上传

如何解决Java文件上传异常(FileUploadException)上传文件在Web开发中经常会遇到的一个问题是FileUploadException(文件上传异常)。它可能会由于各种原因而出现,例如文件大小超过限制、文件格式不匹配或者服务器配置不正确等。本文将介绍一些解决这些问题的方法,并提供相应的代码示例。限制上传文件的大小在大多数场景下,限制文件大小

如何使用gRPC实现文件上传?创建配套服务定义,包括请求和响应消息。在客户端,打开要上传的文件并将其分成块,然后通过gRPC流流式传输发送到服务端。在服务端,接收文件块并将其存储到文件中。服务端在文件上传完成后发送响应,指示上传是否成功。

如何用PHP实现FTP文件上传进度条一、背景介绍在网站开发中,文件上传是一个常见的功能。而对于大文件的上传,为了提高用户体验,我们常常需要给用户显示一个上传进度条,让用户知道文件上传的进程。本文将介绍如何使用PHP实现FTP文件上传进度条的功能。二、FTP文件上传进度条的实现方法基本思路FTP文件上传的进度条实现,通常是通过计算上传的文件大小和已上传文件大小

Laravel中的文件上传和处理:管理用户上传的文件引言:在现代Web应用程序中,文件上传是很常见的功能需求。在Laravel框架中,文件上传和处理变得非常简单和高效。本文将介绍如何在Laravel中管理用户上传的文件,包括文件上传的验证、存储、处理和显示。一、文件上传文件上传是指将文件从客户端上传到服务器端。在Laravel中,文件上传非常容易处理。首先,

PHP文件上传指南:如何使用move_uploaded_file函数处理上传文件在开发Web应用中,文件上传是一个常见的需求。PHP提供了一个方便的函数move_uploaded_file(),用于处理上传的文件。本文将向您介绍如何使用这个函数来实现文件上传功能。一、准备工作在开始之前,确保您的PHP环境已经配置好了文件上传的参数。您可以通过打开php.in

答案:是,Golang提供的函数可以简化文件上传处理。详情:MultipartFile类型提供对文件元数据和内容的访问。FormFile函数从表单请求中获取特定文件。ParseForm和ParseMultipartForm函数用于解析表单数据和多部分表单数据。使用这些函数简化了文件处理流程,让开发者专注于业务逻辑。
