2011-02-02 87 views
3

有沒有一種方法來驗證文件是它聲稱是根據它的文件擴展名?驗證文件是它聲稱是它的文件擴展名

我有大量的文件,我的應用程序複製到遠程服務器。在做每個文件副本之前,我想驗證該文件實際上是文件擴展名所聲稱的。

現在用戶使用NSOpenPanel選擇文件的文件和/或目錄。一旦我有一組文件,我可以在複製開始之前驗證每個文件的物理存在。我有驗證源目錄是可寫的工作正常,並使用FSCopyObjectAsync與所有文件取消到位的副本也工作正常。

最後一塊是這個驗證檢查。我的用戶可以上傳的內容有限,但是使用文件擴展名完成篩選。例如,惡意用戶可以通過文件擴展名獲取一個單詞文檔文件(.doc)並將其更改爲.png,以便通過初始打開的對話框驗證。

這是一個相當簡單的例子。這些文件被服務器使用,我只想確保無法運行的文件不會上傳。

我看着NSFileManagerattributeOfItems:atPath:,但它似乎並沒有提供真正的文件類型的任何信息。文件類型只返回一個目錄,符號鏈接等。

我寧願不試圖打開並加載每個文件來驗證,只是讀取文件頭並檢查它是否符合它需要的任何文件類型規範。

這不是一個iOS應用程序。

任何和所有幫助或指針在正確的方向非常讚賞。

回答

0

基本上沒有。文件系統只知道一些關於文件的非常有限的事情。可以有更多元數據相關聯,但在很多情況下不會有 - 元數據可能存在。如果你想確定一個文件真的包含它聲明的內容,你需要打開它並查看。

根據文件類型和信任級別,您可能不需要看整件事情。例如,文件的第一個字節可能有一個幻數,或者可能有其他標題信息足以說服你。但他們的存在並不能保證文件將「工作」。

1

您可以嘗試運行/usr/bin/file --mime以獲取MIME類型。

+0

凱文 - 值得一試,但沒有運氣。我將一個jpg重命名爲png,並將它改爲png而不是jpg。好主意,但。 – Hooligancat 2011-02-03 00:15:27

3

您可以使用libmagic或MagicKit,這是一個圍繞libmagic的Objective-C包裝。 MagicKit可以返回給定文件的UTI或MIME類型。

+0

感謝Bavarious,儘管這可能起作用,但我們有使用第三方軟件的商業運輸影響。所以這將是一個非首發(雖然它可能會出現在未來的項目中) – Hooligancat 2011-02-02 21:41:08

+0

Bavarious--我收回它。 MagicKit是麻省理工學院許可的,因此它可以工作。將檢查出來,讓你知道。 – Hooligancat 2011-02-02 21:42:28