Php 是否每个文件都有与之关联的MIME类型?

Php 是否每个文件都有与之关联的MIME类型?,php,security,mime,file-extension,Php,Security,Mime,File Extension,我最近实现了一个安全系统,在该系统中,我们根据可接受的MIME类型和文件扩展名列表检查MIME类型和文件扩展名。如果扫描的文件在此列表中有MIME和扩展名,我们将继续。我已经包括了我们扫描下面文件的功能。ALLOWED_EXTENSIONS和ALLOWED_MIME_type只是诸如“txt、pdf、jpeg…”之类的字符串 我假设您知道MIME类型是什么以及如何工作的,但是最近我们得到的PDF上传根本没有MIME类型。顺便说一下,这段代码大部分时间都有效。我已经看到PDF很好地通过,以及图像,

我最近实现了一个安全系统,在该系统中,我们根据可接受的MIME类型和文件扩展名列表检查MIME类型和文件扩展名。如果扫描的文件在此列表中有MIME和扩展名,我们将继续。我已经包括了我们扫描下面文件的功能。
ALLOWED_EXTENSIONS
ALLOWED_MIME_type
只是诸如“txt、pdf、jpeg…”之类的字符串

我假设您知道MIME类型是什么以及如何工作的,但是最近我们得到的PDF上传根本没有MIME类型。顺便说一下,这段代码大部分时间都有效。我已经看到PDF很好地通过,以及图像,文本文件,等等

文件是否可能根本没有MIME类型

 /**
 * scan the file before upload to do our various security checks
 *
 * @param  tmpName    the file's location in /tmp, used for MIME type scan
 * @param  name       the filename as it was uploaded, used for extension scan
 * @param  oid        the order id, passed along to notifyStaffIllegalFileUpload() if email needs to be sent
 * @return            true on success, error string on failure
 */
function scanFile($tmpName, $name, $oid) {
    global $_email;

    // get lists from config
    $allowedExtensions = explode(",", ALLOWED_EXTENSIONS);
    $allowedMIMEs = explode(",", ALLOWED_MIME_TYPES);

    // get extension
    $ext = pathinfo($name, PATHINFO_EXTENSION);

    // get MIME type
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $tmpName);
    finfo_close($finfo);

    // check against allowed
    if (!in_array(strtolower($ext), $allowedExtensions) || !in_array(strtolower($mime), $allowedMIMEs)) {
        capDebug(__FILE__, __LINE__, "Order #" . $oid . " - A user attempted to upload a file with extension '" . $ext . "' and MIME type '" . $mime . "'. The attempt was blocked.\n", "/tmp/file_errors.log");
        $_email->notifyStaffIllegalFileUpload($oid, $name, $ext, $mime);
        return "Our security systems detected an illegal file type/mime type. The file upload was cancelled.";
    }

    return true;
}

经过几天的研究和建议,这个问题的答案有点无关紧要,因为首先检查MIME类型作为安全特性是不可行的。不同操作系统上的MIME类型存在太多问题,不同的应用程序以不同的方式保存文件,一些文件根本没有MIME,最后,恶意用户或程序可能会更改扩展名和MIME。结束

除了OP自己的答案(并不试图回答实际问题)之外,这并不是很明确的定义。内容类型
application/octet-stream
是通用的,因此可以分配给每个文件。另一方面,显然可以创建没有有用内容类型的文件;您将如何用MIME类型标记
ddif=/dev/uradom
的输出


在这里的问题框架中,我倾向于“否”——不可能为每个可能的文件分配有用的MIME类型。

内容类型是对接收端发送内容的提示。没有任何东西表明必须提供暗示,或者暗示必须准确。在某些windows系统上,文件的类型完全由其文件扩展名决定。如果你上传了一个无扩展名的文件,那么除了application/octet-stream之类的泛型类型外,没有任何内容类型可以预先设置。这一点,再加上我从同事那里得到的一些其他建议,让我找到了答案。使用MIME类型进行安全检查是不可行的。句号,这不是安全检查,句号。但他们确实告诉你,文件的外层就是它所声称的。但是仅仅说“这真的是一个pdf”是不够的。pdf本质上是一个postscript程序,也可以包含其他“活动”内容。您实际上没有关闭问题,因此它仍然在需要回答的问题队列中。如果你不想接受这里的答案,也许你真的想删除你的问题?当您以作者身份登录时,在实际问题下方的链接旁边有一个“删除”链接。不过,我觉得它有点用处;也许接受并保留。是的,你的权利,我需要关闭它。我现在正在想办法。