File Upload(废稿)

105次阅读
2 条评论

共计 3408 个字符,预计需要花费 9 分钟才能阅读完成。

常见的文件上传过滤手段

  • 服务器JS前端校验
function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}
  • 文件头content-type字段校验(image/gif)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['file']['tmp_name']);
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (in_array($mimeType, $allowedMimeTypes)) {
    echo "文件类型合法";
} else {
    echo "文件类型不合法";
}
  • 文件内容头校验(GIF89a)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['file']['tmp_name']);
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (in_array($mimeType, $allowedMimeTypes)) {
    echo "文件类型合法";
} else {
    echo "文件类型不合法";
}
  • 后缀名黑名单校验
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空
​
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
​
  • 后缀名白名单校验
// 定义允许上传的文件后缀白名单
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif'];
​
// 获取上传文件的后缀
$fileExtension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
​
// 转换为小写,确保校验时不受大小写影响
$fileExtension = strtolower($fileExtension);
​
// 检查文件后缀是否在白名单中
if (in_array($fileExtension, $allowedExtensions)) {
    echo "文件类型合法,允许上传";
    // 进行后续文件上传操作
} else {
    echo "文件类型不合法,拒绝上传";
}
  • 自定义正则校验
$fileName = $_FILES['file']['name'];
$pattern = '/^photo_\w+\.(jpg|png)$/i';
​
if (preg_match($pattern, $fileName)) {
    echo "文件名格式合法,允许上传";
} else {
    echo "文件名格式不合法,拒绝上传";
}
  • 文件内容校验
$image = imagecreatefromstring(file_get_contents($_FILES['file']['tmp_name']));
if ($image !== false) {
    echo "文件类型合法";
    imagedestroy($image);
} else {
    echo "文件类型不合法";
}

常见php函数

exif_imagetype() #通过读取文件的头部字节并检查其签名来判断文件类型。

常见绕过手段

文件名变形绕过

1.大小写绕过

在对大小写敏感的服务器上使用可以

如使用.phP,.Php,.pHp等

2.文件头绕过

在木马前面插入文件头或者将木马和正常的图片文件合并

tips:一种特殊的文件头部(可以注释的同时也绕过了文件头校验,可以配合.htaccess)

#define width 1
#define height 1

3.配合操作系统文件命令规则

上传不符合windows文件命名规则的文件名   test.asp.   test.asp(空格)   test.php:1.jpg   test.php::$DATA   shell.php::$DATA……. 会被windows系统自动去掉不符合规则符号后面的内容。

4.0×00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候

  test.php(0x00).jpg   test.php%00.jpg

配置文件上传绕过

.htaccess

htaccess文件时Apache服务中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮助我们实现:网页301重定向、自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能.

前提:http.conf文件中设置 AllowOverried All ,才能使用.htaccess文件

.user.ini

前提:

服务器脚本语言为PHP  
​
服务器使用CGI/FastCGI模式  
​
上传目录下要有可执行的php文件
正文完
 0
Rycarl
版权声明:本站原创文章,由 Rycarl 于2025-03-20发表,共计3408字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(2 条评论)
Bail
2025-03-23 08:47:45 回复

还有获取图片尺寸(宽和高)等方法哦

 Android  Chrome  中国重庆重庆市联通
    2025-03-23 18:05:53 回复

    @Bail 好的好的 :idea:

     Windows  Edge  中国重庆重庆市联通