第二十五天
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-861485.html
一、PHP文件管理-下載&刪除功能實(shí)現(xiàn)
1.文件上傳:
- 無(wú)過(guò)濾機(jī)制
- 黑名單過(guò)濾機(jī)制
- 白名單過(guò)濾機(jī)制
- 文件類型過(guò)濾機(jī)制
2.文件刪除:
- unlink() 文件刪除函數(shù)
- 調(diào)用命令刪除:system shell_exec exec等
3. 文件下載:
修改HTTP頭實(shí)現(xiàn)文件讀取解析下載:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-861485.html
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="");
header("Content-Length: " . filesize($file));
readfile($file);
二、PHP文件管理-編輯&包含功能實(shí)現(xiàn)
1.文件包含:
include() 在錯(cuò)誤發(fā)生后腳本繼續(xù)執(zhí)行
require() 在錯(cuò)誤發(fā)生后腳本停止執(zhí)行
include_once() 如果已經(jīng)包含,則不再執(zhí)行
require_once() 如果已經(jīng)包含,則不再執(zhí)行
2.架構(gòu):
- 上傳至服務(wù)器本身的存儲(chǔ)磁盤(源碼在一起)
- 云產(chǎn)品OSS存儲(chǔ)對(duì)象去存儲(chǔ)文件(泄漏安全)
- 把文件上傳到其他域名,如:www.xiaodi8.com->upload.xiaodi8.com
$_FILES:PHP中一個(gè)預(yù)定義的超全局變量,用于在上傳文件時(shí)從客戶端接收文件,并將其保存到服務(wù)器上。它是一個(gè)包含上傳文件信息的數(shù)組,包括文件名、類型、大小、臨時(shí)文件名等信息。
$_FILES["表單值"]["name"] 獲取上傳文件原始名稱
$_FILES["表單值"]["type"] 獲取上傳文件MIME類型
$_FILES["表單值"]["size"] 獲取上傳文件字節(jié)單位大小
$_FILES["表單值"]["tmp_name"] 獲取上傳的臨時(shí)副本文件名
$_FILES["表單值"]["error"] 獲取上傳時(shí)發(fā)生的錯(cuò)誤代碼
move_uploaded_file() 將上傳的文件移動(dòng)到指定位置的函數(shù)
3.文件顯示:
- 打開(kāi)目錄讀取文件列表
- 遞歸循環(huán)讀取文件列表
- 判斷是文件還是文件夾
- PHP.INI目錄訪問(wèn)控制
is_dir() 函數(shù)用于檢查指定的路徑是否是一個(gè)目錄
opendir() 函數(shù)用于打開(kāi)指定的目錄,返回句柄,用來(lái)讀取目錄中的文件和子目錄
readdir() 函數(shù)用于從打開(kāi)的目錄句柄中讀取目錄中的文件和子目錄
open_basedir:PHP.INI中的設(shè)置用來(lái)控制腳本程序訪問(wèn)目錄
ini_set('open_basedir',__DIR__); 設(shè)置配置文件中,只能訪問(wèn)本目錄
4.文件編輯:
- file_get_contents() 讀取文件內(nèi)容
- fopen() fread() 文件打開(kāi)讀入
5.安全問(wèn)題
- 打開(kāi)upload.js文件可能會(huì)泄露accessid和accesskey,如果有這兩個(gè)東西,就可以使用OSS瀏覽器進(jìn)行訪問(wèn)
- 兩個(gè)漏洞核心第一是可以控制的值,二是使用了什么函數(shù)去調(diào)用這個(gè)值。使用了包含文件的函數(shù)就是包含文件漏洞,使用了文件上傳的函數(shù)就是文件上傳漏洞,以此類推
- 如果命令無(wú)回顯,可以使用帶外回顯的方式來(lái)確認(rèn)命令是否執(zhí)行成功。例:del 1.txt || ping 127.0.0.1
三、環(huán)境復(fù)現(xiàn)
1.文件顯示
<?php
// 獲取路徑參數(shù),如果未提供則默認(rèn)為當(dāng)前目錄
$path = $_GET['path'] ?? './';
// 定義獲取文件列表的函數(shù)
function getlist($path) {
// 打開(kāi)目錄句柄
$hd = opendir($path);
// 初始化文件列表數(shù)組
$list = array();
// 循環(huán)讀取目錄中的文件名
while (($file_name = readdir($hd)) !== false) {
// 排除當(dāng)前目錄和父目錄
if ($file_name != '.' && $file_name != '..') {
// 構(gòu)建文件完整路徑
$file_path = "$path/$file_name";
// 獲取文件類型
$file_type = filetype($file_path);
// 輸出文件類型
echo $file_type;
// 將文件信息存入列表數(shù)組
$list[$file_type][] = array(
'file_name' => $file_name, // 文件名存儲(chǔ)鍵值
'file_path' => $file_path, // 文件路徑存儲(chǔ)鍵值
'file_size' => round(filesize($file_path) / 1024), // 通過(guò)換算文件大小存儲(chǔ)鍵值
'file_time' => date('Y/m/d H:i:s', filemtime($file_path)) // 獲取文件時(shí)間并存儲(chǔ)鍵值
); // Ending bracket for array declaration
} // Ending bracket for if statement
} // Ending bracket for while loop
// 關(guān)閉目錄句柄
closedir($hd);
// 返回文件列表數(shù)組
return $list;
}
// 調(diào)用函數(shù)獲取文件列表
$list = getlist($path);
?>
<?php if (isset($list['dir']) && is_array($list['dir'])): ?>
<?php foreach ($list['dir'] as $v): ?>
<!-- 開(kāi)始循環(huán)輸出文件夾目錄行 -->
<tr>
<td><img src="./img/list.png" width="20" height="20"></td>
<!-- 顯示目錄圖標(biāo) -->
<td><?php echo $v['file_name']?></td>
<!-- 輸出文件夾名 -->
<td><?php echo $v['file_time']?></td>
<!-- 輸出文件夾修改時(shí)間 -->
<td>-</td>
<!-- 占位符,因?yàn)槟夸洓](méi)有文件大小 -->
<td><?php echo $v['file_path']?></td>
<!-- 輸出文件夾路徑 -->
<td><a href="?path=<?php echo $v['file_path']?>">打開(kāi)</a></td>
<!-- 在表格中創(chuàng)建“打開(kāi)”鏈接,鏈接到目錄的路徑 -->
</tr>
<!-- 結(jié)束循環(huán)輸出目錄行 -->
<?php endforeach;?>
<?php endif; ?>
<?php if (isset($list['file']) && is_array($list['file'])): ?>
<?php foreach ($list['file'] as $v): ?>
<!-- 開(kāi)始循環(huán)輸出文件行 -->
<tr>
<td><img src="./img/file.png" width="20" height="20"></td>
<!-- 顯示文件圖標(biāo) -->
<td><?php echo $v['file_name']?></td>
<!-- 輸出文件名 -->
<td><?php echo $v['file_time']?></td>
<!-- 輸出文件修改時(shí)間 -->
<td><?php echo $v['file_size']?> KB</td>
<!-- 輸出文件大小 -->
<td><?php echo $v['file_path']?></td>
<!-- 輸出文件路徑 -->
<td>
<a href="?a=edit&path=<?php echo $v['file_path']?>">編輯</a>
<!-- 創(chuàng)建編輯鏈接 -->
<a href="?a=down&path=<?php echo $v['file_path']?>">下載</a>
<!-- 創(chuàng)建下載鏈接 -->
<a href="?a=del&path=<?php echo $v['file_path']?>">刪除</a>
<!-- 創(chuàng)建刪除鏈接 -->
</td>
</tr>
<!-- 結(jié)束循環(huán)輸出文件行 -->
<?php endforeach; ?>
<?php endif; ?>
2.文件下載
<?php
// 接受方法 判斷是怎么操作
switch ($action){
case 'del':
unlink($file);
// 如果操作為刪除,則調(diào)用unlink函數(shù)刪除指定文件
break;
case 'down':
header("Content-Type: application/octet-stream");
// 設(shè)置響應(yīng)內(nèi)容的類型為二進(jìn)制流,告知瀏覽器這是一個(gè)文件下載
header("Content-Disposition: attachment; filename=\"" . $file . "\"");
// 設(shè)置瀏覽器提示下載,并指定下載文件的名稱(使用 $file 變量)
header("Content-Length: " . filesize($file));
// 設(shè)置響應(yīng)內(nèi)容的長(zhǎng)度為文件大小,告知瀏覽器文件的實(shí)際大小
readfile($file);
// 讀取并輸出文件內(nèi)容,將文件內(nèi)容發(fā)送給瀏覽器
break;
}
?>
到了這里,關(guān)于第25天:安全開(kāi)發(fā)-PHP應(yīng)用&文件管理&包含&寫(xiě)入&刪除&下載&上傳&遍歷&安全的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!