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

news2024/11/15 20:11:22

第二十五天

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;
}
?>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我独自升级崛起怎么下载 一文分享我独自升级崛起游戏下载教程

我独自升级崛起怎么下载 一文分享我独自升级崛起游戏下载教程 我独自升级&#xff1a;崛起是一款由韩国漫画改编而成的热门多人网络在线联机游戏&#xff0c;这款游戏是一款的角色扮演类型游戏&#xff0c;游戏有着独一无二的剧情模式。小伙伴们在游戏中可以体验到独特的成长系…

URL解析

目录 URIURLURL语法相对URLURL中的转义 现在与未来PURL 在 URL出现之前&#xff0c;人们如果想访问网络中的资源&#xff0c;就需要使用不同的 应用程序&#xff0c;如共享文件需要使用 FTP程序&#xff0c;想要发送邮件必须使用 邮件程序&#xff0c;想要看新闻那只能使用…

VSCode 配置 C/C++ 环境

1 安装 VSCode 直接去官网(https://code.visualstudio.com/)下载并安装即可。 2 配置C/C编译环境 方案一 如果是在Windows&#xff0c;需要安装 MingW&#xff0c;可以去官网(https://sourceforge.net/projects/mingw-w64/)下载安装包。 注意安装路径不要出现中文。 打开 w…

JAVA面向对象(下)(四、内部类、枚举、包装类)

一、内部类&#xff08;续&#xff09; 1.1 内部类的分类 按照声明的位置划分&#xff0c;可以把内部类分为两大类&#xff1a; 成员内部类&#xff1a;方法外 局部内部类&#xff1a;方法内 public class 外部类名{【修饰符】 class 成员内部类名{ //方法外}【修饰符】 返…

力扣刷题 70.爬楼梯

题干 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&…

HarmonyOS开发实例:【图片编辑应用】

介绍 本篇Codelab通过动态设置元素样式的方式&#xff0c;实现几种常见的图片操作&#xff0c;包括裁剪、旋转、缩放和镜像。效果如图所示&#xff1a; 相关概念 [image组件]&#xff1a;图片组件&#xff0c;用来渲染展示图片。[div组件]&#xff1a;基础容器组件&#xff0…

PLC_博图系列☞N=:在信号下降沿置位操作数

、 PLC_博图系列☞N&#xff1a;在信号下降沿置位操作数 文章目录 PLC_博图系列☞N&#xff1a;在信号下降沿置位操作数背景介绍N&#xff1a; 在信号下降沿置位操作数说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 N 背景介绍 这是一篇关于PLC编程的…

Python网络数据抓取(3):Requests

引言 在这一部分&#xff0c;我们将探讨Python的requests库&#xff0c;并且利用这个库来进行网页数据抓取。那么&#xff0c;我们为何需要这个库&#xff0c;以及怎样利用它呢&#xff1f; requests库是广受大家欢迎的一个库&#xff0c;它是下载次数最多的。这个库使我们能够…

C语言学习/复习27----sizeof/strlen/数组/指针

一、数组笔试题目解析 1.一维数组 1.sizeof()操作符与int数组 注意事项1&#xff1a;sizeof()依据类型推断大小 注意事项2&#xff1a;注意区分是( )内是地址还是普通元素类型 注意事项3&#xff1a;&#xff08;&#xff09;内是单独的数组名时计算整个数组的大小&#xff0c;…

海外服务器被恶意攻击怎么办

如果您的海外服务器遭受了恶意攻击&#xff0c;以下是一些应对措施和步骤&#xff0c;立即隔离服务器。如果您察觉到服务器受到恶意攻击&#xff0c;立即隔离服务器&#xff0c;将其与网络隔离&#xff0c;以防止攻机进一步扩散。通知服务器提供商&#xff0c;以便他们能够提供…

有了可视化工具,你定制设计得瑟瑟发抖了吧,其实你想多了。

目前市面上有N多可视化的工具&#xff0c;可以做成可视化大屏&#xff0c;甚至有很多B端系统也附带可视化页面&#xff0c;据此就有很多人开始怀疑我们这些做定制开发的&#xff0c;还有啥生存空间。 其实你真的多虑了&#xff0c;存在即合理&#xff0c;我们承认可视化工具的标…

小白必备:Python必须掌握的十大模块,建议收藏!

前言 Python 是一种高级、解释型和通用动态编程语言&#xff0c;侧重于代码的可读性。 它在许多组织中使用&#xff0c;因为它支持多种编程范例。 它还执行自动内存管理。 它是世界上最受欢迎的编程语言之一。 这是有很多原因的&#xff1a; 这很容易学习。它超级多才多艺。…

05集合-CollectionListSet

Collection体系的特点、使用场景总结 如果希望元素可以重复&#xff0c;又有索引&#xff0c;索引查询要快? 用ArrayList集合, 基于数组的。(用的最多) 如果希望元素可以重复&#xff0c;又有索引&#xff0c;增删首尾操作快? 用LinkedList集合, 基于链表的。 如果希望增…

【电机控制】滑模观测器PMSM无感控制波形图

【电机控制】滑模观测器PMSM无感控制波形图 文章目录 前言一、FOC控制1.三相电流2.Clark变换静止坐标系iαiβ3.park变换旋转坐标系idiq4.电流环PI控制输出UdUq5.UdUq 反park变换UαUβ 二、反电动势观测器BEMF1.静止坐标系iαiβ提取反电动势EaEb2.反电动势EaEb提取位置信息、…

【国信华源参加全国地质灾害防治新技术新方法新设备交流会】

4月17-18日&#xff0c;以“提升地质灾害防治能力 服务保障高质量发展”为主题&#xff0c;由中国地质灾害防治与生态修复协会主办、云南地质工程第二勘察院有限公司承办的“全国地质灾害防治新技术新方法新设备成果交流会”在云南昆明圆满召开。会议特邀中国工程院院士等知名…

实现游戏地图读取与射击运行

射击代码来源自2D 横向对抗射击游戏&#xff08;by STF&#xff09; - CodeBus 地图读取改装自 瓦片地图编辑器 解决边界检测&#xff0c;实现使用不同像素窗口也能移动不闪退-CSDN博客 // 程序&#xff1a;2D RPG 地图编辑器改游戏读取器 // 作者&#xff1a;民用级脑的研发…

【电控笔记6.3】采样-Z转换-零阶保持器

本质 数字转模拟:零阶保持器 采样 z-1所描述的物理意义即为延迟T时间的拉氏转换e-sT 信号采样延时

stable diffusion本地部署@win10

一键无脑安装stable-diffusion-webui stable diffusion是当前非常出色的文生图模型&#xff0c;要优于以前gan文生图模型。现在有了stable-diffusion-webui软件&#xff0c;可以一键安装&#xff0c;大大简化了操作难度。本文档就是stable-diffusion-webui在windows 10上的安装…

UI5:面向企业级应用的JavaScript框架

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

OpenTelemetry-1.介绍

目录 1.是什么 2.为什么使用 OpenTelemetry 3.数据类型 Tracing Metrics Logging Baggage 4.架构图 5.核心概念 6.相关开源项目 ​编辑 7.分布式追踪的起源 8.百花齐放的分布式追踪 Zipkin Skywalking Pinpoint Jaeger OpenCensus OpenTracing 9.Openteleme…