RE_ABANDON 2019-01-24 11:07 采纳率: 60%
浏览 889

php 修改Content-Type无法绕过MIME检验

刚学php,写了一个限制文件上传类型的代码,由一个htmlt提交表单,调用一个php处理,php使finfo_open(FILEINFO_MIME_TYPE)获取MIME类型。在本地测试时,用Burp Suite 拦截抓包后修改Content-Type,发现仍然被识别出来,修改无效,大神们请问这是什么原因?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 19:09
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你使用了 finfo_open 来获取 MIME 类型,并且使用了 FILEINFO_MIME_TYPE 这个常量来指定要检查的 MIME 类型。这个常量是 PHP 内部定义的一个常量,用来表示不同的 MIME 类型。因此,在你的代码中,无论你是否设置了 Content-Type 的值,都会被正确地识别为 HTML。

    解决方法:

    1. 你可以尝试将 CONTENT_TYPE 设置为特定的 MIME 类型,而不是默认的 text/html
    2. 如果你的网站允许上传其他类型的文件(例如 .zip、.pdf 等),那么你需要在服务器端对这些文件进行适当的处理,确保它们符合预期的 MIME 类型。
    3. 在客户端,你应该阻止浏览器自动设置 Content-Type,或者在用户选择上传文件前,手动设置合适的 MIME 类型。

    以下是一个示例代码片段,演示如何通过设置 CONTENT_TYPE 来防止 MIME 类型检测:

    if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
        $filename = basename($_FILES['file']['name']);
        $type = pathinfo($filename, PATHINFO_EXTENSION);
        
        if ($type == 'zip') { // 将这里替换为你想要的 MIME 类型
            header('Content-Type: application/zip');
            move_uploaded_file($_FILES['file']['tmp_name'], 'path/to/save/your/file.zip');
        } elseif ($type == 'pdf') { // 或者其他的 MIME 类型
            header('Content-Type: application/pdf');
            move_uploaded_file($_FILES['file']['tmp_name'], 'path/to/save/your/file.pdf');
        }
    }
    

    这段代码会根据上传的文件名判断 MIME 类型并相应地设置 Content-Type。

    评论

报告相同问题?