PHP之文件上傳漏洞


因為最近在制作班級網站,考慮到文件上傳帶來的安全問題,特此研究一下。

下面看一個簡單的上傳代碼

<form action="index.php" method="post" enctype="multipart/form-data" name="form">
  <input type="file" name="file" /><br />
  <input type="submit" value="上傳文件" />
  <input type="hidden" name="MAX_FILE_SIZE" value="1024" />
</form>

注意在php.ini中(應環境各異),在xampp集成搭建環境中uplod_max_filesize默認上傳最大大小為128mb。

請注意PHP使用$_FILES數組上傳文件,假設上傳jpg圖片,大小18KB,看如下代碼

$FILES

Array

{

        [file] => Array

        {

                [name] => test.jpg                //文件名稱

                [type] => image/jpeg //MIME類型 

                [tmp_name] => /tmp/php5D.tmp        //臨時文件

                [error] => 0                //錯誤信息

                [size] => 18                //文件大小,單位字節

        }

}

如果上傳文件按鈕的name屬性值為file

<input type="file" name="file" />

那么使用$_FILES['file']['name']來獲得客戶端上傳文件名稱,不包含路徑。使用$_FILES['file']['tmp_name']來獲得服務端保存上傳文件的臨時文件路徑

存放上傳文件的文件夾

PHP不會直接將上傳文件放到網站根目錄中,而是保存為一個臨時文件,名稱就是$_FILES['file']['tmp_name']的值,開發者必須把這個臨時文件復制到存放的網站文件夾中。

$_FILES['file']['tmp_name']的值是由PHP設置的,與文件原始名稱不一樣,開發者必須使用$_FILES['file']['name']來取得上傳文件的原始名稱。

如圖產生錯誤信息


文件上傳漏洞

如果提供給網站訪問者上傳圖片的功能,那必須小心訪問者上傳的實際可能不是圖片,而是可以指定的PHP程序。如果存放圖片的目錄是一個開放的文件夾,則入侵者就可以遠程執行上傳的PHP文件來進行攻擊。

下面是一個簡單的文件上傳例子:

<?php
// 設置上傳文件的目錄
$uploaddir = "D:/www/images/";

// 檢查file是否存在
if (isset($_FILES['file'])) 
{
 // 要放在網站目錄中的完整路徑,包含文件名
    $uploadfile = $uploaddir . $_FILES['file']['name'];
 // 將服務器存放的路徑,移動到真實文件名
 move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile);
}
?>
……
<form method="post" enctype="multipart/form-data" name="form">
  <input type="file" name="file" /><br />
  <input type="submit" value="上傳文件" />
  <input type="hidden" name="MAX_FILE_SIZE" value="1024" />
</form>

這個例子沒有檢驗文件后綴,可以上傳任意文件,很明顯的上傳漏洞






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM