2012-02-14 74 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的選項。