一套web應(yīng)用程序,一般都會提供文件上傳的功能,方便來訪者上傳一些文件。
下面是一個(gè)簡單的文件上傳表單
- <form action="upload.php" method="post" enctype="multipart/form-data" name="form1">
- <input type="file" name="file1" /><br />
- <input type="submit" value="上傳文件" />
- <input type="hidden" name="MAX_FILE_SIZE" value="1024" />
- form>
php的配置文件php.ini,其中選項(xiàng)upload_max_filesize指定允許上傳的文件大小,默認(rèn)是2M
$_FILES數(shù)組變量
PHP使用變量$_FILES來上傳文件,$_FILES是一個(gè)數(shù)組。如果上傳test.txt,那么$_FILES數(shù)組的內(nèi)容為:
- $FILES
- Array
- {
- [file] => Array
- {
- [name] => test.txt
- [type] => text/plain
- [tmp_name] => /tmp/php5D.tmp
- [error] => 0
- [size] => 536
- }
- }
如果上傳文件按鈕的name屬性值為file
- <input type="file" name="file" />
那么使用$_FILES['file']['name']來獲得客戶端上傳文件名稱,不包含路徑。使用$_FILES['file']['tmp_name']來獲得服務(wù)端保存上傳文件的臨時(shí)文件路徑
存放上傳文件的文件夾
PHP不會直接將上傳文件放到網(wǎng)站根目錄中,而是保存為一個(gè)臨時(shí)文件,名稱就是$_FILES['file']['tmp_name']的值,開發(fā)者必須把這個(gè)臨時(shí)文件復(fù)制到存放的網(wǎng)站文件夾中。
$_FILES['file']['tmp_name']的值是由PHP設(shè)置的,與文件原始名稱不一樣,開發(fā)者必須使用$_FILES['file']['name']來取得上傳文件的原始名稱。
上傳文件時(shí)的錯(cuò)誤信息
$_FILES['file']['error']變量用來保存上傳文件時(shí)的錯(cuò)誤信息,它的值如下:
錯(cuò)誤信息 |
數(shù)值 |
說 明 |
UPLOAD_ERR_OK |
0 |
沒有錯(cuò)誤 |
UPLOAD_ERR_INI_SIZE |
1 |
上傳文件的大小超過php.ini的設(shè)置 |
UPLOAD_ERR_FROM_SIZE |
2 |
上傳文件的大小超過HTML表單中MAX_FILE_SIZE的值 |
UPLOAD_ERR_PARTIAL |
3 |
只上傳部分的文件 |
UPLOAD_ERR_NO_FILE |
4 |
沒有文件上傳 |
文件上傳漏洞
如果提供給網(wǎng)站訪問者上傳圖片的功能,那必須小心訪問者上傳的實(shí)際可能不是圖片,而是可以指定的PHP程序。如果存放圖片的目錄是一個(gè)開放的文件夾,則入侵者就可以遠(yuǎn)程執(zhí)行上傳的PHP文件來進(jìn)行攻擊。
下面是一個(gè)簡單的文件上傳例子:
- php
- // 設(shè)置上傳文件的目錄
- $uploaddir = "D:/www/images/";
- // 檢查file是否存在
- if (isset($_FILES['file1']))
- {
- // 要放在網(wǎng)站目錄中的完整路徑,包含文件名
- $uploadfile = $uploaddir . $_FILES['file1']['name'];
- // 將服務(wù)器存放的路徑,移動到真實(shí)文件名
- move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile);
- }
- ?>
- ……
- <form method="post" enctype="multipart/form-data" name="form1">
- <input type="file" name="file1" /><br />
- <input type="submit" value="上傳文件" />
- <input type="hidden" name="MAX_FILE_SIZE" value="1024" />
- form>
這個(gè)例子沒有檢驗(yàn)文件后綴,可以上傳任意文件,很明顯的上傳漏洞 本文出自:億恩科技【mszdt.com】
php // 設(shè)置上傳文件的目錄 $uploaddir = "D:/www/images/"; // 檢查file是否存在 if (isset($_FILES['file1'])) { // 要放在網(wǎng)站目錄中的完整路徑,包含文件名 $uploadfile = $uploaddir . $_FILES['file1']['name']; // 將服務(wù)器存放的路徑,移動到真實(shí)文件名 move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile); } ?> …… <form method="post" enctype="multipart/form-data" name="form1"> <input type="file" name="file1" /><br /> <input type="submit" value="上傳文件" /> <input type="hidden" name="MAX_FILE_SIZE" value="1024" /> form>
這個(gè)例子沒有檢驗(yàn)文件后綴,可以上傳任意文件,很明顯的上傳漏洞 本文出自:億恩科技【mszdt.com】 -->
服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|