首页 / PHP / php判断上传文件文件类型的安全方法
php判断上传文件文件类型的安全方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php判断上传文件文件类型的安全方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2674字,纯文字阅读大概需要4分钟。
内容图文
![php判断上传文件文件类型的安全方法](/upload/InfoBanner/zyjiaocheng/207/3d03521bd56f4042b86935d137f1d055.jpg)
这样做其实与后门大开无异,举一个简单的例子,通过扩展名判断一般是字符串的截取判断,或者是使用$_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; } return $extType; }
内容总结
以上是互联网集市为您收集整理的php判断上传文件文件类型的安全方法全部内容,希望文章能够帮你解决php判断上传文件文件类型的安全方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。