gpt4 book ai didi

PHP 允许的 zip mimetypes

转载 作者:搜寻专家 更新时间:2023-10-31 21:15:09 26 4
gpt4 key购买 nike

我知道(从这个问题的答案:.rar, .zip files MIME Type)大多数人将 PHP 中的 zip 文件检查为 application/zipapplication/octet-stream ,但我对此有几个问题:

  • 仅检查 application/octet-stream 是否安全(假定 application/octet-stream 可用于描述更多的文件类型,而不仅仅是 zip! ).我知道我也可以通过其他方式检查文件,但我认为我应该尽量让一切都尽可能简单
  • 我已尝试检查尽可能多的不同实际 zi​​p 类型;但是,有些会产生一些意想不到的结果。我发现 1 个 mime 类型是 application/x-external-editor,但是 PHP 在处理它时遇到问题(尽管我得到的唯一错误是 Warning: ZipArchive::close() [ziparchive.close]: Invalid or unitialized Zip object) - 这在任何地方都有记录吗?是否有 PHP 可以处理的实际 x- mimetypes 列表?

编辑

回答以下问题:

  • 我正在使用 $_FILES['fileatt']['type'] 检查 mime 类型,但使用 mime_content_type() 得到相同的结果。不同的 zip 文件似乎是以下任何一种:'application/zip', 'application/x-compressed', 'application/x-zip-压缩''application/x-compressed''multipart/x-zip'。我不明白为什么在检测到 MIME 类型为 application/x-external-editor 时出现错误。
  • 我已经安装了 zip 扩展,并且在上传时从 zip 文件中提取所有文件。我没想过要检查错误。

我还发现了另一件我不太明白的事情:当我将以下代码与 PHP 读取为 application/x-external-editor 的文件一起使用时:

if($zip->open($_FILES[fileatt]['tmp_name'])===TRUE)
{
echo "success";
} else {
echo "error";
}

打印“错误”,但检查文件类型为

$res = $zip->open($_FILES[fileatt]['tmp_name']);
if($res)
{
echo "success";
} else {
echo "error";
}

打印“成功”;在此代码中,我假设 bool 值有效地使用了 ==,而不是 ===,但为什么这会有所不同?

错误:

$res = $zip->open($_FILES[fileatt]['tmp_name']);
if($res===TRUE)
{
echo "success";
} else {
echo $res;
}

打印 19 - 19 指的是哪个错误 ( http://uk3.php.net/manual/en/ziparchive.open.php )?!

最佳答案

永远不要相信 mime 类型,这很容易被客户端欺骗。如果他们愿意,他们可以提交一个 exe 并给它一个 text/plain 的 mime 类型。

所有 zip 文件都以标准本地文件头签名 (0x04034b50) 开头,因此您可以检查文件的前 4 个字节是否与 zip 签名字节匹配。查看PKZIP Appnote了解更多详情。

如果您有 zip extension启用后,您可以更进一步尝试打开并阅读 zip 文件以确保它是一个完全有效的 zip 文件。

像这样的东西效果很好:

$zip = zip_open('/path/to/file.zip');
if (is_int($zip)) {
echo "Error $zip encountered reading the file, is it a valid zip?";
} else {
echo "Thanks for uploading a valid zip file!";
}

zip_open 如果成功打开则返回一个资源,否则返回一个表示读取文件时发生的错误的整数。

编辑:详细说明您的一些问题:

关于application/octet-stream:这个就是你说的,一个很通用的类型。这仅表示包含 8 位数据的任何文件,基本上是所有内容。 application/zip 是事实上的标准 mime 类型,但有些客户端会使用您发现的其他值。还考虑到客户端可以轻松欺骗任何文件类型以使用 application/zip 我不会依赖 $_FILES['fileatt']['type']因为它可以是任何东西。

AFIK,mime_content_type() 只是查看文件扩展名并将其映射到 mime.types 中的 mime 类型文件在系统上或内置到 PHP 中。如果有人将 .zip 扩展名放在 exe 文件上,它仍会注册为 application/zip。我相信某些扩展程序可能会检查文件头。

Zip::open() 返回 TRUE 如果文件打开成功,或者一个整数错误代码。因此,== 会给你一个错误的误报,因为任何非零整数都将使用 == 评估为真,因为它会将非零整数转换为。如果您要检查 Zip::open 的返回,您应该始终使用 $res === true 以检查是否成功。您可以找到错误代码的含义 here在页面底部的评论中。

底线:既然你说你已经解压了 zip,那么根据 mime 类型进行验证可能不那么麻烦,而是尝试打开文件并根据返回结果进行验证会更容易open 的值。如果它返回 true,您可以认为该文件是一个有效的 zip(文件后面当然可能有错误,但他们至少上传了类似 zip 文件的东西)。

希望对您有所帮助。

关于PHP 允许的 zip mimetypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10558251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com