因為最近在制作班級網站,考慮到文件上傳帶來的安全問題,特此研究一下。
下面看一個簡單的上傳代碼。
<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>
這個例子沒有檢驗文件后綴,可以上傳任意文件,很明顯的上傳漏洞