2010-05-28 42 views
4

我有一個腳本可以讓用戶上傳文本文件(PDF或doc)到服務器,然後計劃將它們轉換爲原始文本。但是在文件被轉換之前,它是原始格式,這讓我擔心病毒和各種令人討厭的東西。上傳PDF或.doc和安全

任何想法,我需要做的,以儘量減少這些未知文件的風險。如何檢查它是否乾淨,或者甚至是它聲稱的格式,並且它不會使服務器崩潰。

回答

4

正如我對Aerik評論,但它是真正的問題的答案。

如果您有PHP> = 5.3,請使用finfo_file()。如果您使用的是舊版本的PHP,則可以使用mime_content_type()(不太可靠)或從PECL加載Fileinfo擴展。

這兩個函數都會返回文件的MIME類型(通過查看其中的數據類型)。對於PDF,它應該是

text/pdf 

對於word doc可能是一些事情。通常它應該是

application/msword 

如果您的服務器正在運行* nix,請確保您保存的文件不可執行。更好:將它們保存到Web服務器無法訪問的文件夾中。您仍然可以編寫代碼來訪問文件,但請求網頁的用戶根本無法訪問它們。

+0

你確定'mime_get_contents()'存在嗎?你的意思是'mime_content_type()'? – alex 2011-03-04 03:49:52

+0

@alex - 哎呀!你的權利。與file_get_contents混合。我正在更改我的帖子來修復它。謝謝! – Cfreak 2011-03-04 15:08:33

1

嗡嗡聲 - 恕我直言,你不應該擔心文件類型或什麼;如果你使用一個好的轉換器轉換成原始文本,那麼這個應該做這些檢查而不會造成服務器崩潰。

從您的客戶端計算機中可知,應始終保護服務器免受病毒和攻擊 - 因此,在處理新上載的文件之前應對其進行檢查。

我從來沒有見過一個網絡應用程序做這些有點檢查本身 - 你呢?

1

恕我直言,直到有東西試圖執行它,它只是一個文件。但是,您可以肯定地檢查(但不要依賴,如下文所述)文件擴展名,還可以研究文件格式,以查看文件頭中是否有任何特徵字節序列可以驗證。

+2

不,不,不!永遠不要依靠文件擴展名來告訴你任何事情。在舊版本中,使用PHP> 5.3中的finfo_file()或mime_content_type()。 – Cfreak 2010-05-28 04:43:04

+0

對不起,我不清楚 - 我永遠不會*依賴文件擴展名,我只是說你可以排除任何有*錯誤*擴展名的東西。當然,不要將任何信任放入您找到的匹配擴展中,檢查可能只是無用的開銷。如果你只是想告訴用戶,「對不起,我只接受文檔和pdf」也許很有用。 – Aerik 2010-05-28 05:27:27

1

如果您正在查看PDF,除了獲得防病毒和祈禱,它沒有任何可以做的,它可以捕獲惡意形成的PDF。

轉換軟件通常不是針對性的,所以如果你只是轉換它並查看文本格式輸出,你應該有點安全。


哦,你是擔心服務器。只是不執行上傳的文件...

2

如果您曾在服務器上打開或執行過任何用戶上傳的文件,您應該預料到您的服務器現在已經被入侵。

即使是JPG也可以包含可執行的php。如果您在腳本中以任何方式使用includerequire這個文件,那也會危及您的服務器。你在網上偶然發現的圖像就像這樣......

 

header('Content-type: image/jpeg'); 
header('Content-Disposition: inline; filename="test.jpg"'); 

echo file_get_contents('/some_image.jpg'); 
echo '<?php phpinfo(); ?>'; 

...您保存並在自己的服務器上重新主機是這樣的...

 

$q = $_GET['q']; // pretend this is sanitized for the moment 
header('Content-type: '.mime_content_type($q)); 
header('Content-Disposition: inline; filename="'.$_GET['q'].'"'); 

include $q; 

...將您的服務器上執行phpinfo()。然後,您的網站用戶可以簡單地將圖像保存到他們的桌面,並用記事本打開它以查看您的服務器設置。簡單地將文件轉換爲其他格式將放棄該腳本,並且不應該觸發任何附加到該文件的實際病毒。

對上傳進行病毒搜索也可能最好。您應該能夠對檢查器執行內聯繫統命令並解析其輸出以查看它是否找到任何內容。您的網站用戶應該檢查他們下載的文件。

否則,即使病毒laiden用戶上傳的文件只是坐在你的服務器上應該不會損害任何東西...據我所知。

0
在上傳文件

有保障的3路: 最好的:在最安全的一個 更好的另一臺服務器把文件:把它們放在你的WWW文件夾之外就意味着沒有任何機構可以通過URL來訪問他們,你必須ReadFile的使用( )或get_content來讀取和顯示文件 最後:將文件放入WWW並在文件夾中使用.htaccess,以防止其他人執行文件或放入未知文件 這就是我通過上傳文件所做的事情; 把它們放在web根目錄下,並重命名它們甚至在數據庫中保存假名稱,並通過算法創建文件的真實名稱。

Web根目錄以外的文件上傳後,您可以訪問它,因爲我在這裏做。這裏是文件的內容caleed getfile.php:

<?php 

    define('DS', DIRECTORY_SEPARATOR); 
//fake name of file 
    $uniqueid = $_GET['uniqueid']; 
//file extension 
    $ext = $_GET['ext']; 
    if (isset($_GET['dir'])) 
//check address doenot contain .. 
     $addrss = str_replace('..', '_', $_GET['dir']); 
    $baseaddress = '..' . DS . 'foldername outside of web root'; 
    if ((isset($_GET['uniqueid']) and strlen($uniqueid) === 32) and (isset($_GET['ext']) and strlen($ext) === 3)) { 
     $path = $baseaddress . DS . $addrss . DS; 
     $path .= md5($uniqueid . $uniqueid . $uniqueid . $ext.'*#$%^&') .'.'. $ext; 
     if (file_exists($path)) { 
    //you can check for all your accessible extension i just use for img 
      switch ($ext) { 
       case 'jpg': 
        $content_type = 'image/jpeg'; 
        break; 
       case 'png': 
        $content_type = 'image/png'; 
        break; 
       case 'gif': 
        $content_type = 'image/gif'; 
        break; 
      } 
      header('Content-type: ' . $content_type . ' '); 
      $file = readfile($path); 
     } 

文件SRC或每一個地方,你需要顯示文件做這(這是我的圖片):

<img src="/getfile.php?uniqueid=put fake file name here&amp;ext=put extension here&amp;dir=put rest of file address here" > 

希望能幫助你。不要猶豫,問更多的問題