簡體   English   中英

ZipArchive類PHP安全問題

[英]ZipArchive class PHP security issue

我有以下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文件
  • 加載
  • 上傳某種扭曲的漏洞,最終會改變我的服務器安全性
  • 緩沖區溢出
  • 具有任意代碼注入的文件名

我的意思是,此腳本的安全性如何?

我現在正在運行Windows,我將切換到linux

您的其他四個問題:

加載

那是復雜的部分。 讓我用谷歌搜索一些想法:

上傳某種扭曲的漏洞,最終會改變我的服務器安全性

使用命令行病毒掃描程序( f-protclamav )掃描上載的文件。 您可能在PHP本身中使用了一個幼稚的正則表達式掃描儀(例如,對圖像文件中的HTMLish內容進行了探測),但這並不是事實安全功能; 不要重新發明輪子。

緩沖區溢出

通常,PHP不容易受到緩沖區溢出的影響。

好吧開玩笑 但是您不能在用戶領域做任何事情。 但是向周圍推弦並不是什么大問題。 只要您知道如何在哪種情況下轉義,這在腳本語言中是相當可靠且無法解釋的。

具有任意代碼注入的文件名

千篇一律的是,您應該始終使用basename()來避免路徑遍歷漏洞。 如果要保留用戶指定的文件名,則按順序排列正則表達式白名單。 =preg_replace('/[^\\w\\s.]/', '', $fn)作為粗略示例。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM