2012-07-02 85 views
0

我有下面的PHP代碼ZipArchive類PHP的安全問題

// Check if the upload is setted 
if 
(
    isset($_FILES['file']['name']) && !empty($_FILES['file']['name']) && 
    isset($_FILES['file']['type']) && !empty($_FILES['file']['type']) && 
    isset($_FILES['file']['size']) && !empty($_FILES['file']['size']) 
) 
{ 
    $UploadIsSetted = true; 
    $UploadIsBad = false; 

    $UploadExtension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 

    // Check if the upload is good 
    require "../xdata/php/website_config/website.php"; 
    $RandomFoo = rand(1000999999,9999999999); 

    if (($_FILES["file"]["size"] < ($MaxAvatarPictureSize*1000000))) 
    { 
     if ($_FILES["file"]["error"] > 0) 
     { 
      $UploadIsBad = true; 
      $hrefs->item(0)->setAttribute("Error","true"); 
      $hrefs->item(0)->setAttribute("SomethingWrong","true"); 
     } 
     else 
     { 
      move_uploaded_file($_FILES["file"]["tmp_name"],"../upload/tmp/".$RandomFoo.".file");  
     } 
    } 
    else 
    { 
     // The file is too big 
     $UploadIsBad = true; 
     $hrefs->item(0)->setAttribute("Error","true"); 
     $hrefs->item(0)->setAttribute("UploadTooBig","true"); 
    } 
} 
else 
{ 
    $UploadIsSetted = false; 
} 

$ZipFile = new ZipArchive; 
$ZipFile->open('../upload/tmp/'.$LastFilename.'.zip',ZIPARCHIVE::CREATE); 
$ZipFile->addFile('../upload/tmp/'.$RandomFoo.'.file',$RandomFoo.".".$UploadExtension); 
$ZipFile->close(); 

現在我最大的擔憂是,用戶可以上傳任何東西,所以我怎麼能防止:

  • 上傳2GB 3GB的文件
  • floading
  • 上傳某種扭曲的漏洞,最終會改變我的服務器安全
  • 緩衝區溢出
  • 文件名有任意代碼注入

我的意思是,如何安全是這個腳本?

我跑窗口現在,我將改用Linux

+0

這是太多的子問題一次。要求最重要的。否則請考慮[Codereview.SE](http://codereview.stackexchange.com/)。 – mario

+0

http://www.phpeasystep.com/phptu/3.html – alfasin

回答

1

Four的其他問題:

floading

那是複雜的部分。讓我谷歌你一些想法:

上傳某種扭曲的開發,最終將改變我的服務器 安全

使用命令行病毒掃描程序(f-protclamav)來掃描上傳的文件。您可能會在PHP中使用天真的正則表達式掃描程序(例如,探測圖像文件中的HTMLish內容),但這不是一個事實性的安全功能;不要重新發明輪子。

緩衝區溢出

PHP中一般不容易受到緩衝區溢出。

好吧,開個玩笑。但是你不能在用戶區做任何事情。但推絃樂並不是什麼問題。這在腳本語言中是非常可靠和無法企及的,只要你知道如何逃避什麼。

文件名有任意代碼注入

在非常真皮休閒包,你應該最經常使用basename()避免路徑遍歷漏洞。如果你想保留用戶指定的文件名,正則表達式白名單是有序的。 =preg_replace('/[^\w\s.]/', '', $fn)作爲粗略的例子。

+0

非常感謝,非常有用:)很高興閱讀所有這些 – Master345

0

你行if (($_FILES["file"]["size"] < ($MaxAvatarPictureSize*1000000)))已經限制了文件的接受$MaxAvatarPictureSize兆字節大小。雖然$MaxAvatarPictureSize似乎沒有在您提供的代碼中設置。我的猜測應該是1或2最大。 也沒有設置是$LastFilename,也可能是其他一些。

也放置一個if($UploadIsBad === false) { /* do zipping */ }周圍的壓縮部分,以避免壓縮太大或無效的文件。

+0

並且不能$ _FILES [「file」] [「size」]是假的?注入一些代碼?我不知道,我不是秒專家,但我應該成爲,我正在開發一個軟件... – Master345

+1

他可能會使用['upload_max_filesize'](http://www.php.net/manual /en/ini.core.php#ini.upload-max-filesize),因爲這樣可以避免PHP處理臃腫的請求。 (雖然帶有非友好的用戶消息) – mario

+0

額外的檢查是調用'filesize($ _ FILES [「file」] [「tmp_name」])來檢查實際大小而不是依賴於$ _FILES [「file」] [ 「大小」]'@RowMinds說。 –