0

我正在尝试检测通过 php 上传的音频文件的 mime 类型。我允许 .mp3 .mp4 和 .wav。出于某种原因,即使它是其中一种类型,它仍然说它是不正确的文件类型。这是我的验证码:

$allowedExts = array("wav", "mp3", "mp4", "mpeg");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "audio/wave") || ($_FILES["file"]["type"] == "audio/mp4")|| ($_FILES["file"]["type"] == "audio/mpeg"))&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  {

  }

如果有人解决了这个问题,请提交代码的固定部分,而不仅仅是其中的一部分。我很感激任何帮助!

4

1 回答 1

1

检查 mime 类型的更好方法是让 phps 内部函数处理文件。$_FILES["file"] 的内容很容易被攻击者部分伪造。另外,你有一个可靠的来源,你的 mime 类型是如何拼写的。

试试finfo http://php.net/manual/de/function.finfo-open.php

$allowedMimeTypes = array('audio/wave', 'audio/mp4', 'audio/whatevermore');
$allowedExts = array('wav', 'mp3', 'mp4', 'mpeg');
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

$finfo = new finfo(FILEINFO_MIME);
$mime = $finfo->file($_FILES['file']['tmp_name']);  

if(in_array($mime, $allowedMimeTypes) && filesize($_FILES['file']['tmp_name']) < 200000 && in_array($extension, $allowedExts)) {
    echo 'yeah';
}
于 2013-02-08T23:30:56.127 回答