2012-02-14 69 views
1

我正在为自己写一个多文件上传功能。PHP文件验证

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

我可以很容易地检查文件是否是合法的图像,但是有没有类似的验证上述文件扩展名的方法。

编辑的问题不是检查,如果文件中有像PSD,CDR等我需要能够验证文件是一个合法的PSD或CDR文件扩展名。

+2

等等文件最简单 - 因为它是未定义的,所以没有什么可检查的。但说实话,你需要对每种格式进行验证。可能有些人存在,先做一个研究。如果你列出你后来发现的答案,会很喜欢它。另请参见[如何检查在PHP中上传的文件的文件类型?](http://stackoverflow.com/questions/310714/how-to-check-file-types-of-uploaded-files-in-php) – hakre 2012-02-14 09:46:33

+0

以及psd文件可以检查,因为它们有点XML结构。对于etc文件,我的意思是可能出现的其他设计软件文件扩展名,但前4个是最重要的 – michaeltintiuc 2012-02-14 09:49:23

+1

我会从两个方面着手:首先查明文件规范是否公开可用以及哪些版本的文件格式存在。维基百科不是一个太糟糕的出发点。第二方面是搜索这些文件的库。对于更流行的格式,我会假设一些可能已经存在的PHP。否则,我会查找系统库,如果你在linux上运行。 – hakre 2012-02-14 10:01:02

回答

1

使用FileInfo功能来获取对接收的文件的MIME类型实:

http://www.php.net/manual/en/intro.fileinfo.php

不要相信上传文件的扩展名,这是浏览器发送的数据,很容易伪造。假设输入文件没有名字,没有扩展名。

+0

看起来像mime-type是要走的路,即使它可能是假的,也没有办法运行坏脚本,至少没有我知道的。 – michaeltintiuc 2012-02-14 10:15:19

+0

@Skatebail - 如果您担心通过上传器进行某种脚本注入,您可以将上传的文件放在docroot之外或者通过subdir中的.htaccess阻止任何直接文件访问。我个人会让用户通过另一个脚本下载这些文件(例如,您可能希望保护的某些文件,例如盗链,公共访问等)。 – ashein 2012-02-14 10:36:53

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! 
} 
+0

这个函数根本不会验证任何东西,我可以轻松地编写一个php shell并将其重命名为psd。另外你应该检查文件名中的多个“点”。谢谢你的时间,但我真的很感激。 – michaeltintiuc 2012-02-14 09:55:11

+1

了解!你想检查选中的文件是否真的是具有该扩展名的文件。 RAW WAY:你应该打开一些具有相同扩展名的文件,并检查该文件的头部是否与其他文件相同。用这种方法你可以用fopen打开文件并获得头文件(fgets),这样你才能真正检查文件是否正确。重复你想要允许的所有扩展文件的操作:) – JackTurky 2012-02-14 11:17:11

1

是和否。

从文件名提取扩展名是一个简单的字符串操作。
要测试提取的扩展对阵预定义的扩展是不是一个火箭科学太。

但是,在某些情况下,这种验证可能会危及您的网站安全。
如果你使用的是Apache网络服务器,它有非常奇怪的习惯,在多个文件之间寻找文件扩展名。
假设一个文件名为image.php.cad的文件将作为Apache脚本以默认设置执行。

避免这种危险,或者不使用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/提供)

+0

感谢这是关于apache如何工作的一些方便的信息。但我已经配置了这种方式。 – michaeltintiuc 2012-02-14 10:00:29

0

我并不真正了解为您提供如此准确信​​息的php命令。上述所有内容均基于可被欺骗的文件扩展名。

如果你的Web服务器的* nix系统上运行,因此您可以将文件看起来文件内容的头部使用系统命令file

system("file $filePath"); 

这是可靠的(文件扩展名不会改变结果) 。该命令特定于二进制文件。像sql这样的文本文件都是ascii。

如果您将此视为解决方案,请查看手册页并检查file的选项。