第25天:安全开发-PHP应用文件管理包含写入删除下载上传遍历安全

第二十五天

Untitled

一、PHP文件管理-下载&删除功能实现

1.文件上传:

  1. 无过滤机制
  2. 黑名单过滤机制
  3. 白名单过滤机制
  4. 文件类型过滤机制

2.文件删除:

  1. unlink() 文件删除函数
  2. 调用命令删除:system shell_exec exec等

3. 文件下载:

修改HTTP头实现文件读取解析下载:

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="");
header("Content-Length: " . filesize($file));
readfile($file);

二、PHP文件管理-编辑&包含功能实现

1.文件包含:

include() 在错误发生后脚本继续执行
require() 在错误发生后脚本停止执行
include_once() 如果已经包含,则不再执行
require_once() 如果已经包含,则不再执行

2.架构:

  1. 上传至服务器本身的存储磁盘(源码在一起)
  2. 云产品OSS存储对象去存储文件(泄漏安全)
  3. 把文件上传到其他域名,如:www.xiaodi8.com->upload.xiaodi8.com
$_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。
$_FILES["表单值"]["name"] 获取上传文件原始名称
$_FILES["表单值"]["type"] 获取上传文件MIME类型
$_FILES["表单值"]["size"] 获取上传文件字节单位大小
$_FILES["表单值"]["tmp_name"] 获取上传的临时副本文件名
$_FILES["表单值"]["error"] 获取上传时发生的错误代码
move_uploaded_file() 将上传的文件移动到指定位置的函数

3.文件显示:

  1. 打开目录读取文件列表
  2. 递归循环读取文件列表
  3. 判断是文件还是文件夹
  4. PHP.INI目录访问控制
is_dir() 函数用于检查指定的路径是否是一个目录
opendir() 函数用于打开指定的目录,返回句柄,用来读取目录中的文件和子目录
readdir() 函数用于从打开的目录句柄中读取目录中的文件和子目录
open_basedir:PHP.INI中的设置用来控制脚本程序访问目录
ini_set('open_basedir',__DIR__); 设置配置文件中,只能访问本目录

4.文件编辑:

  1. file_get_contents() 读取文件内容
  2. fopen() fread() 文件打开读入

5.安全问题

  1. 打开upload.js文件可能会泄露accessid和accesskey,如果有这两个东西,就可以使用OSS浏览器进行访问
  2. 两个漏洞核心第一是可以控制的值,二是使用了什么函数去调用这个值。使用了包含文件的函数就是包含文件漏洞,使用了文件上传的函数就是文件上传漏洞,以此类推
  3. 如果命令无回显,可以使用带外回显的方式来确认命令是否执行成功。例:del 1.txt || ping 127.0.0.1

三、环境复现

1.文件显示

<?php
// 获取路径参数,如果未提供则默认为当前目录
$path = $_GET['path'] ?? './';

// 定义获取文件列表的函数
function getlist($path) {
    // 打开目录句柄
    $hd = opendir($path);

    // 初始化文件列表数组
    $list = array();

    // 循环读取目录中的文件名
    while (($file_name = readdir($hd)) !== false) {
        // 排除当前目录和父目录
        if ($file_name != '.' && $file_name != '..') {
            // 构建文件完整路径
            $file_path = "$path/$file_name";

            // 获取文件类型
            $file_type = filetype($file_path);

            // 输出文件类型
            echo $file_type;

            // 将文件信息存入列表数组
            $list[$file_type][] = array(
                'file_name' => $file_name,          // 文件名存储键值
                'file_path' => $file_path,          // 文件路径存储键值
                'file_size' => round(filesize($file_path) / 1024),  // 通过换算文件大小存储键值
                'file_time' => date('Y/m/d H:i:s', filemtime($file_path)) // 获取文件时间并存储键值
            ); // Ending bracket for array declaration
        } // Ending bracket for if statement
    } // Ending bracket for while loop

    // 关闭目录句柄
    closedir($hd);

    // 返回文件列表数组
    return $list;
}

// 调用函数获取文件列表
$list = getlist($path);
?>
<?php if (isset($list['dir']) && is_array($list['dir'])): ?>
<?php foreach ($list['dir'] as $v): ?>
    <!-- 开始循环输出文件夹目录行 -->
    <tr>
        <td><img src="./img/list.png" width="20" height="20"></td>
        <!-- 显示目录图标 -->
        <td><?php echo $v['file_name']?></td>
        <!-- 输出文件夹名 -->
        <td><?php echo $v['file_time']?></td>
        <!-- 输出文件夹修改时间 -->
        <td>-</td>
        <!-- 占位符,因为目录没有文件大小 -->
        <td><?php echo $v['file_path']?></td>
        <!-- 输出文件夹路径 -->
        <td><a href="?path=<?php echo $v['file_path']?>">打开</a></td>
        <!-- 在表格中创建“打开”链接,链接到目录的路径 -->
    </tr>
    <!-- 结束循环输出目录行 -->
<?php endforeach;?>
<?php endif; ?>

<?php if (isset($list['file']) && is_array($list['file'])): ?>
<?php foreach ($list['file'] as $v): ?>
    <!-- 开始循环输出文件行 -->
    <tr>
        <td><img src="./img/file.png" width="20" height="20"></td>
        <!-- 显示文件图标 -->
        <td><?php echo $v['file_name']?></td>
        <!-- 输出文件名 -->
        <td><?php echo $v['file_time']?></td>
        <!-- 输出文件修改时间 -->
        <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>
            <!-- 创建编辑链接 -->
            <a href="?a=down&path=<?php echo $v['file_path']?>">下载</a>
            <!-- 创建下载链接 -->
            <a href="?a=del&path=<?php echo $v['file_path']?>">删除</a>
            <!-- 创建删除链接 -->
        </td>
    </tr>
    <!-- 结束循环输出文件行 -->
<?php endforeach; ?>
<?php endif; ?>

2.文件下载

<?php
// 接受方法 判断是怎么操作
switch ($action){
    case 'del':
        unlink($file);
        // 如果操作为删除,则调用unlink函数删除指定文件
        break;
    case 'down':
        header("Content-Type: application/octet-stream");
        // 设置响应内容的类型为二进制流,告知浏览器这是一个文件下载
        header("Content-Disposition: attachment; filename=\"" . $file . "\"");
        // 设置浏览器提示下载,并指定下载文件的名称(使用 $file 变量)
        header("Content-Length: " . filesize($file));
        // 设置响应内容的长度为文件大小,告知浏览器文件的实际大小
        readfile($file);
        // 读取并输出文件内容,将文件内容发送给浏览器
        break;
}
?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565142.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

问题带来多少成长,看你挖得有多深多痛

原文: 一次Redis访问超时的“捉虫”之旅 力是相互的&#xff0c;成长与痛苦也是相互的。 01-引言 最近在对一个老项目使用的docker镜像版本升级过程中碰到一个奇怪的问题&#xff0c;发现项目升级到高版本镜像后&#xff0c;访问Redis会出现很多超时错误&#xff0c;而降回之…

stable diffusion Temporal-kit和EbSynth视频转动画学习笔记

1、打开stable diffsuion webui 点击Temporal-kit 页签&#xff0c;再点击预处理pre-processing,上传视频 在工作目录下得到拆分的关键帧,在input目录里 打开图生图&#xff0c;输入正反描述词&#xff0c;其他配置如下 批量生成图片&#xff0c;找到最满意的那一张&#xff0…

如何判别三角形和求10 个整数中最大值?

分享每日小题&#xff0c;不断进步&#xff0c;今天的你也要加油哦&#xff01;接下来请看题------> 一、已知三条边a&#xff0c;b&#xff0c;c能否构成三角形&#xff0c;如果能构成三角形&#xff0c;判断三角形的类型&#xff08;等边三角形、等腰三角形或普通三角形 …

【Interconnection Networks 互连网络】Torus 网络拓扑

1. Torus 网络拓扑2. Torus 网络拓扑结构References 1. Torus 网络拓扑 Torus 和 Mesh 网络拓扑&#xff0c;又可以称为 k-ary n-cubes&#xff0c;在规则的 n 维网格中包裹着 N k^n 个节点&#xff0c;每个维度都有 k 个节点&#xff0c;并且最近邻居之间有通道。k-ary n-c…

数据可视化(八):Pandas时间序列——动态绘图,重采样,自相关图,偏相关图等高级操作

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

关于杰理AC695蓝牙模式下按键处理函数处理

一、杰理蓝牙模式下又分为SYS_KEY_EVENT和SYS_BT_EVENT。SYS_KEY_EVEN主要是对按键的控制事件&#xff0c;SYS_BT_EVENT是蓝牙模式协议栈状态事件、hci事件、对箱事件。 二、按键通过key_event *key &event->u.key; u定义了一个union事件的联合体&#xff0c;通过按键k…

【C++ STL序列容器】array 数组

文章目录 【 1. 基本原理 】【 2. array 的创建 】2.1 不赋初值2.2 赋默认值2.3 赋指定值 【 3. array 的成员函数 】实例 【 1. 基本原理 】 array 是在 C 普通数组的基础上添加了一些成员函数和全局函数。在使用上&#xff0c;它 比普通数组更 安全&#xff0c;且效率并没…

Web3钱包开发获取测试币-Base Sepolia(二)

Web3钱包开发获取测试币-Base Sepolia(二) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b0c0ac86b04a496087471388532bc54a.png) 基于上篇 Web3钱包开发获取测试币-Polygon Mumbai(一) &#xff1a;https://suwu150.blog.csdn.net/article/details/137949473 我…

呼市经开区建设服务项目水、电能耗监测 数采案例

一、项目背景及需求 项目地点位于内蒙古呼和浩特市&#xff0c;呼市数字经开区建设服务项目。属于企业用能数据采集、能耗监测板块子项目。 针对水、电能耗数据采集&#xff0c;结合现场客观因素制约&#xff0c;数据采集方面存在较大难度。大多数国网电表485接口由于封签限制…

WordPress 告别 MySQL:Docker SQLite WordPress

本篇文章聊聊&#xff0c;如何将这个持续诞生和维护了 21 年的开源软件“脱离数据库”运行&#xff0c;让它能够更加轻量、适合低成本离线运行。 写在前面 2003 年&#xff0c;Michel Valdrighi 基于 b2/cafelog 创建了开源软件 WordPress&#xff0c;并在 GPL 协议下发布。 …

【ARM Trace32(劳特巴赫) 使用介绍 12.1 -- Trace32 读写 64位地址】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 读写 64位地址读 64 位地址写64位地址Trace32 读写 64位地址 在使用TRACE32进行调试时,有时需要读取或操作64位的地址,特别是在处理64位的处理器或操作系统时。以下是如何在TRACE32中读取64位地址的一般方法。 读 64 位地…

Hadoop大数据处理技术-配置连接篇

​2024/4/17 Hadoop学习前的准备 3&#xff09;连接虚拟机 上一节配置完成了基础的虚拟机配置及网络配置 下面我们开始建立连接 我们为什么要与虚拟机建立链接呢&#xff1f; 连接虚拟机就好像跟亲友联系一样 总得找个便捷又好用的工具才行 Secure CRT就像是一把能打开通向…

高斯过程回归【详细数学推导】

机器学习笔记 第一章 机器学习简介 第二章 感知机 第三章 支持向量机 第四章 朴素贝叶斯分类器 第五章 Logistic回归 第六章 线性回归和岭回归 第七章 多层感知机与反向传播【Python实例】 第八章 主成分分析【PCA降维】 第九章 隐马尔可夫模型 第十章 奇异值分解 第十一章 熵…

AI-数学-高中-39空间向量-2空间向量法(法向量)

原作者视频&#xff1a;【空间向量】【一数辞典】2空间向量法&#xff08;重要&#xff09;_哔哩哔哩_bilibili 法向量&#xff08;高中阶段所有与面的关系&#xff0c;都可以通过法向量去证明和解答&#xff09;&#xff1a; 是空间解析几何的一个概念&#xff0c;垂直于平面…

JAVA学习笔记28(常用类)

1.常用类 1.1 包装类 1.包装类的分类 ​ 1.针对八中基本数据类型相应的引用类型–包装类 ​ 2.有了类的特点&#xff0c;就可以调用类中的方法 2.包装类和基本数据类型的转换 ​ *装箱&#xff1a;基本类型 --> 包装类型 //手动装箱 int n1 100; Integer integer ne…

上市公司-企业数据要素利用水平数据集及参考文献(2010-2022年)

01、数据介绍 企业数据要素利用水平是指企业在其生产经营活动中&#xff0c;对数据的收集、处理、分析和应用的能力及效果。这种利用水平的高低直接反映了企业在数字化时代中的竞争力和创新能力。 本数据参考《中央财经大学学报》史青春&#xff08;2023&#xff09;老师的研…

Excel文件解析--超大Excel文件读写

使用POI写入 当我们想在Excel文件中写入100w条数据时&#xff0c;我们用普通的XSSFWorkbook对象写入时会发现&#xff0c;只有在将100w条数据全部加载入内存后才会用write()方法统一写入&#xff0c;这样效率很低&#xff0c;所以我们引入了SXSSFWorkbook进行超大Excel文件的读…

javaWeb项目-网吧网咖管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JAVA简介 JavaSc…

本地环境通过ssh通道连接服务器数据库,实现本地客户端和代码可以访问数据库

使用方法&#xff1a; ssh -p 搭建隧道的端口 -fNL 本地端口:远程ip:远程端口号 搭建隧道的账号搭建隧道的ip 可以增加参数-v,输出更多的信息 ssh -p 搭建隧道的端口 -fNL 本地端口:远程ip:远程端口号 -v 搭建隧道的账号搭建隧道的ip 有时候&#xff0c;测试环境的数据库不允许…

深度卷积神经网络的整体运行流程(以alexnet为例)

0.基础概念&#xff08;复习一下&#xff09; 1.小批量随机梯度下降 目的&#xff1a; 希望找到最佳的参数&#xff0c;使损失函数最小。 使损失函数对w求导&#xff08;b就是x等于1的w&#xff09;&#xff0c;一个小批次的/eta&#xff08;学习率&#xff09;*小批次的平均…