PHP fileupload类型检查

时间:2014-12-24 10:14:19

标签: php

好的,这是我上传文件的代码

 $ext_whitelist = array('pdf','doc','doc','mkv','mp4','mpg','mpeg','avi','flv','wma','ogg');

 if(in_array($ext, $ext_whitelist))
 {
     $uniqid_file = uniqid('', true)."_".$file['name'];
     $lokacija = $folder . "/" . $uniqid_file;
     $encoded_uniqid_file = base64_encode($uniqid_file);
     move_uploaded_file($file['tmp_name'], $lokacija);
     $base_url= base_url("forms/fdownload/$encoded_uniqid_file/$path");
     $form_data[$key] = "<a href=".$base_url.">$uniqid_file </a>";
 }

这会检查文件扩展名,以便有些人可以重命名文件,有人可以帮我检查文件类型吗?

2 个答案:

答案 0 :(得分:1)

您可以使用

  

Perl的文件mimeinfo

前: -

$file_path = '/tmp/temp.jpg';
$mimetype = trim(shell_exec("/usr/bin/mimetype -bi ".escapeshellarg($file_path)));
$info = null;
if(strpos($mimetype, "video/")===0 || strpos($mimetype, 'x-flash-video') > 0){
  $info = 'video';
}elseif(strpos($mimetype, "audio/")===0){
  $info = 'audio';
}elseif(strpos($mimetype, "image/")===0){
  $info = 'image';
}

答案 1 :(得分:1)

发表评论时,我会写一些答案。

如果您想知道文件的类型,Mimetype检查是一件好事,但如果您想在上传时允许/拒绝文件,则不安全,因为伪造mimetype非常容易。 试试吧,您可以使用代理更改它,或者您可以创建一个简单的图像,然后在最后添加一些PHP代码并将其重命名为.php。如果您只检查mimetype,则可以上传此.php文件并在服务器上运行它。

如果你上传带有php代码的.jpg,没关系,服务器不会通过php解析器推送它。 (除非您更改默认配置。(Apache:AddType,nginx:AddHandler)

有一些“安全”方法可以检查上传的文件:

1。检查扩展程序并将其与白名单进行比较。

这是问题中的例子,但我想写一个完整的解决方案。 (在.之后只检查第一个想法的常见错误,因为可能存在如下文件名:something.txt.php所以总是检查最后一个后缀。)

$ext = array_pop(explode(".", $fileName));
$whitelist = array('pdf','doc','doc','mkv','mp4','mpg','mpeg','avi','flv','wma','ogg');

if (in_array($ext, $whitelist) {
  //OK the extension is good, handle the upload.
} else {
  //Wrong type, add error message.
}

如果你使用这样的东西,要小心,不要允许扩展名,如.php和服务器配置中的任何内容。

2。重命名文件并删除扩展名。

这是另一种好方法,但也许你想保留原始文件名,扩展名和mimetype。您可以将它们存储在数据库中!

对于这个解决方案,只需要采用原始文件名,添加一些随机数据(因为如果你上传到一个文件夹而你想上传something.jpg 2次,那将是一个坏主意),然后存储它。 例如:

$newName = sha1($fileName.time());
move_uploaded_file($file['tmp_name'], $uploadPath . $newName);

由于该文件没有扩展名,服务器不会尝试运行它。 (但是,如果它是一个图像,它将在浏览器中工作,因为他们使用mimetype来确定类型,我们没有改变它。)