好的,这是我上传文件的代码
$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>";
}
这会检查文件扩展名,以便有些人可以重命名文件,有人可以帮我检查文件类型吗?
答案 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)
有一些“安全”方法可以检查上传的文件:
这是问题中的例子,但我想写一个完整的解决方案。 (在.
之后只检查第一个想法的常见错误,因为可能存在如下文件名: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和服务器配置中的任何内容。
这是另一种好方法,但也许你想保留原始文件名,扩展名和mimetype。您可以将它们存储在数据库中!
对于这个解决方案,只需要采用原始文件名,添加一些随机数据(因为如果你上传到一个文件夹而你想上传something.jpg 2次,那将是一个坏主意),然后存储它。 例如:
$newName = sha1($fileName.time());
move_uploaded_file($file['tmp_name'], $uploadPath . $newName);
由于该文件没有扩展名,服务器不会尝试运行它。 (但是,如果它是一个图像,它将在浏览器中工作,因为他们使用mimetype来确定类型,我们没有改变它。)