一套web應(yīng)用程序,一般都會(huì)提供文件上傳的功能,方便來(lái)訪者上傳一些文件。
下面是一個(gè)簡(jiǎn)單的文件上傳表單
- <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來(lái)上傳文件,$_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']來(lái)獲得客戶端上傳文件名稱(chēng),不包含路徑。使用$_FILES['file']['tmp_name']來(lái)獲得服務(wù)端保存上傳文件的臨時(shí)文件路徑
存放上傳文件的文件夾
PHP不會(huì)直接將上傳文件放到網(wǎng)站根目錄中,而是保存為一個(gè)臨時(shí)文件,名稱(chēng)就是$_FILES['file']['tmp_name']的值,開(kāi)發(fā)者必須把這個(gè)臨時(shí)文件復(fù)制到存放的網(wǎng)站文件夾中。
$_FILES['file']['tmp_name']的值是由PHP設(shè)置的,與文件原始名稱(chēng)不一樣,開(kāi)發(fā)者必須使用$_FILES['file']['name']來(lái)取得上傳文件的原始名稱(chēng)。
上傳文件時(shí)的錯(cuò)誤信息
$_FILES['file']['error']變量用來(lái)保存上傳文件時(shí)的錯(cuò)誤信息,它的值如下:
錯(cuò)誤信息 |
數(shù)值 |
說(shuō) 明 |
UPLOAD_ERR_OK |
0 |
沒(méi)有錯(cuò)誤 |
UPLOAD_ERR_INI_SIZE |
1 |
上傳文件的大小超過(guò)php.ini的設(shè)置 |
UPLOAD_ERR_FROM_SIZE |
2 |
上傳文件的大小超過(guò)HTML表單中MAX_FILE_SIZE的值 |
UPLOAD_ERR_PARTIAL |
3 |
只上傳部分的文件 |
UPLOAD_ERR_NO_FILE |
4 |
沒(méi)有文件上傳 |
文件上傳漏洞
如果提供給網(wǎng)站訪問(wèn)者上傳圖片的功能,那必須小心訪問(wèn)者上傳的實(shí)際可能不是圖片,而是可以指定的PHP程序。如果存放圖片的目錄是一個(gè)開(kāi)放的文件夾,則入侵者就可以遠(yuǎn)程執(zhí)行上傳的PHP文件來(lái)進(jìn)行攻擊。
下面是一個(gè)簡(jiǎn)單的文件上傳例子:
- php
- // 設(shè)置上傳文件的目錄
- $uploaddir = "D:/www/images/";
- // 檢查file是否存在
- if (isset($_FILES['file1']))
- {
- // 要放在網(wǎng)站目錄中的完整路徑,包含文件名
- $uploadfile = $uploaddir . $_FILES['file1']['name'];
- // 將服務(wù)器存放的路徑,移動(dòng)到真實(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è)例子沒(méi)有檢驗(yàn)文件后綴,可以上傳任意文件,很明顯的上傳漏洞 本文出自:億恩科技【1tcdy.com】
php // 設(shè)置上傳文件的目錄 $uploaddir = "D:/www/images/"; // 檢查file是否存在 if (isset($_FILES['file1'])) { // 要放在網(wǎng)站目錄中的完整路徑,包含文件名 $uploadfile = $uploaddir . $_FILES['file1']['name']; // 將服務(wù)器存放的路徑,移動(dòng)到真實(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è)例子沒(méi)有檢驗(yàn)文件后綴,可以上傳任意文件,很明顯的上傳漏洞 本文出自:億恩科技【1tcdy.com】 -->
服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|