文件上传是我们常常需要开发的功能,试试用最安全的方式,判断用户上传的图片为正常的图片(jpg\gif\png)。
解题思路:
1、检查提交的文件的扩展名是否是图片(这一步很容易伪造的,所以不可靠)
2、依据文件的头信息检查文件是否真的是图片 (这一步基本就是图片了,但是依然可能包含木马的脚本)
3、用正则检查文件里面是否包含木马的脚本
以下是“坚持到底”的PHP版本代码
<?php
//允许的图片类型
$imageType = array('jpg','gif','png');
//上传后存放的路径
$uploadfile = './data/' . basename($_FILES['userfile']['name']);
//获取文件的扩展名
$finfo = new SplFileInfo($_FILES['userfile']['name']);
$extName=$finfo->getExtension();
//第一道关卡,简单过滤非法文件。
if(!in_array($extName,$imageType)){
exit('只能上传gif、png和jpg的图片');
}
//依据文件头信息检查图片的真实类型
//1 IMAGETYPE_GIF
//2 IMAGETYPE_JPEG
//3 IMAGETYPE_PNG
$realType=exif_imagetype($_FILES['userfile']['tmp_name']);
if( 1 == $realType || 2 ==$realType || 3 ==$realType){
//开始检查是否存在木马代码
$safe=is_safe($_FILES['userfile']['tmp_name']);
if(!$safe){
exit ('图片包含木马,禁止上传!');
}
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "文件上传成功.\n";
} else {
echo "上传失败!\n";
}
}else{
exit ('只能上传gif、png和jpg的图片');
}
function is_safe($fileurl) {
$handle = fopen($fileurl, 'rb');
$fileSize = filesize($fileurl);
fseek($handle, 0);
if ($fileSize > 512) { // 取头和尾
$hexCode = bin2hex(fread($handle, 512));
fseek($handle, $fileSize - 512);
$hexCode .= bin2hex(fread($handle, 512));
} else { // 取全部
$hexCode = bin2hex(fread($handle, $fileSize));
}
fclose($handle);
/* 匹配16进制中的 <% ( ) %> */
/* 匹配16进制中的 <? ( ) ?> */
/* 匹配16进制中的 <script | /script> 大小写亦可*/
//匹配表示有木马
return !preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode);
}
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号