我正在为自己编写多文件上传功能。
问题是我将上传.psd,.cdr,.indd,.cad等文件。
我可以轻松检查文件是否是合法图像,但是有类似的方法来验证上面提到的文件扩展名。
编辑问题不在于检查文件是否有像psd,cdr等扩展名。我需要能够验证文件是否是合法的PSD或CDR文件。
答案 0 :(得分:1)
是和否。
从文件名中提取扩展名是一个简单的字符串操作 测试针对预定义扩展数组的提取扩展也不是一门火箭科学。
但是,在某些情况下,此类验证可能会损害您的网站安全性
如果您使用的是Apache Web服务器,它有一种非常特殊的习惯,即在多个文件扩展名之间查找文件扩展名
比如,Apache将使用默认设置将文件名image.php.cad
作为PHP脚本执行。
要避免这样的危险要么根本不使用Apache,要么在整个文件名中搜索.php
,要么以这种方式配置PHP
<FilesMatch \.php$>
SetHandler php5-script
</FilesMatch>
(由http://verens.com/2008/10/13/security-hole-for-files-with-a-dot-at-the-end/提供)
答案 1 :(得分:1)
使用FileInfo
功能获取接收文件的真实mimetype:
http://www.php.net/manual/en/intro.fileinfo.php
不要相信上传文件的扩展名,这是浏览器发送的数据很容易伪造。假设输入文件没有名称,没有扩展名。
答案 2 :(得分:0)
function endsWith($haystack, $needle)
{
$length = strlen($needle);
$start = $length * -1; //negative
return (substr($haystack, $start) === $needle);
}
if(!endWith($_FILES['file1']['name'],".psd") || !endWith(..)...){
//Error! file extension not correct
}else{
//correct!
}
答案 3 :(得分:0)
您可以使用函数pathinfo
:
if ( pathinfo($_FILES['fileinput']['name'], PATHINFO_EXTENSION) == 'psd' ) {
// do something...
}
要检查mime-type,请尝试使用http://ru.php.net/manual/en/function.finfo-file.php
答案 4 :(得分:0)
我真的不知道为您提供如此准确信息的php命令。上面提到的所有内容都基于可以欺骗的文件扩展名。
如果您的网络服务器在* nix系统上运行,您可以使用系统命令file
system("file $filePath");
这是可靠的,因为文件看起来是文件内容的头部(文件扩展名不会改变结果)。此命令特定于二进制文件。像sql这样的文本文件都是ascii。
如果您将此视为解决方案,请查看手册页并查看file
的选项。