PHP文件验证

时间:2012-02-14 09:44:36

标签: php validation file-upload

我正在为自己编写多文件上传功能。

问题是我将上传.psd,.cdr,.indd,.cad等文件。

我可以轻松检查文件是否是合法图像,但是有类似的方法来验证上面提到的文件扩展名。

编辑问题不在于检查文件是否有像psd,cdr等扩展名。我需要能够验证文件是否是合法的PSD或CDR文件。

5 个答案:

答案 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的选项。