[英]Is php fileinfo sufficient to prevent upload of malicious files?
我已經搜索了一些,並沒有真正找到關於如何擁有安全文件上傳功能的專業類型響應。 所以我想在這個網站上征求一些專家的意見。 我目前允許上傳 mp3 和圖像,雖然我對防止網站上的 xss 和注入攻擊非常有信心,但我對文件上傳安全性並不十分熟悉。 我基本上只是使用 php fileinfo 並根據文件類型檢查一組接受的文件類型。 對於圖像,有 getimagesize 函數和一些額外的檢查。 至於存儲它們,我的目錄中只有一個文件夾,因為我希望用戶能夠使用這些文件。 如果有人能給我一些提示,我將不勝感激。
我通常在接受可以共享的文件時調用ClamAV 。 使用 PHP,這很容易通過php-clamav完成。
您最不想做的一件事就是在全球范圍內傳播惡意軟件 :)
如果可以,請在文件上傳后但在公開之前在后台執行此操作。 這個類的一個怪癖是它可以將整個ClamAV 病毒定義數據庫加載到內存中,如果 PHP 在 Apache 下運行,這幾乎肯定會很糟糕(想想每個實例 +120 MB 的內存量級)。
使用諸如beanstalkd 之類的東西來掃描上傳然后更新您的數據庫以將它們公開是解決此問題的一個很好的方法。
我提到這一點只是因為其他答案沒有,我絕不打算將其作為一個完整的解決方案。 請參閱此處發布的其他答案,這是您應該完成的步驟。 總是,總是,總是清理你的輸入,確保它是預期的類型,等等(我有沒有提到你也應該閱讀其他答案?)
“惡意”文件並不是損害您的服務器的唯一途徑(如果您的站點關閉,就會損害您的用戶) 。
例如,上傳大量非常小的文件可能會損壞服務器:
...當沒有空閑的 inode 時,就不可能再創建任何文件; 這顯然很糟糕。
之后,也有這樣的問題:
為此,您對技術解決方案無能為力——但“提醒版主”功能通常很有幫助;-)
不,因為這很容易被欺騙。 有一篇文章描述了如何通過上傳 1x1“jpg 文件”來攻擊服務器以及如何防止它。 好讀。
從“文件類型”($_FILES['userfile']['type']) 開始是完全沒有意義的。 這是 HTTP post 請求中的一個變量,可以是攻擊者想要的任何值。 盡快刪除此檢查。
getimagesize() 是驗證圖像真實性的極好方法。 聲音文件可能有點棘手,您可以在命令行上調用file /tmp/temp_uploaded_file
。
到目前為止,上傳文件最重要的部分是文件的擴展名。 如果文件是 .php,那么你就被黑了。 更糟糕的是,Apache 可以配置為在無法識別的情況下忽略第一個文件擴展名,然后使用下一個擴展名,因此該文件將被執行為一個普通的 .php 文件: backdoor.php.junk
。 默認情況下,這應該被禁用,但幾年前它被默認啟用。
您必須必須使用文件擴展名白名單。 所以你想強制使用像: jpg,jpeg,gif,png,mp3
這樣的文件,否則拒絕它。
首先要做的是通過服務器配置禁止在該目錄中執行任何服務器端代碼(例如 PHP)。 為 MIME 類型(或文件擴展名,因為您的服務器首先使用它們來確定 MIME 類型)設置白名單並且只允許媒體文件(不是 HTML 或任何內容)將保護您免受 XSS 注入。 那些結合文件類型檢查應該足夠了 - 我能想到的唯一可能通過那些利用圖像/音頻解碼器的東西,以及發現那些你需要接近病毒掃描程序的東西。
如果exiv2
無法刪除元數據,它至少可能是惡意的或以某種方式損壞的。 在您的 unix 系統上安裝以下所需的exiv2
。 不幸的是,如果文件包含惡意 shell 代碼,這可能很危險。 不確定exiv2
對 shell 攻擊的強大exiv2
,因此請謹慎使用。 我沒用過,但我想過用它。
function isFileMalicious($file)
{
try{
$out = [];
@exec('exiv2 rm '.escapeshellarg($file).' 2>&1',$out);
if(!empty($out)){
return false;
}
}
catch(exception $e)
{
return false;
}
return true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.