php开发之文件下载的实现

news/发布时间2024/8/25 17:30:45

前言

php是网络安全学习里必不可少的一环,简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理

正文

在正常的开发中,文件下载的功能是必不可少,比如我们在论坛看到好看图片好听的歌时,将其下载下来时就涉及到文件的下载等等文件功能。但也会出现漏洞,或者一些bug。这部分是php开发部分的文件下载部分,为啥不写完?感觉有点多。

文件下载代码的实现

完整的css代码

/* css样式初始化 */
* {font-family: 'Poppins', sans-serif;margin: 0;padding: 0;box-sizing: border-box;outline: none;border: none;text-decoration: none;text-transform: capitalize;transition: .2s linear;
}html {font-size: 62.5%;
}
/* header样式初始化*/
.header {position: fixed;top: 0;left: 0;right: 0;z-index: 1000;background: #3F3D56;display: flex;align-items: center;justify-content: space-between;
}.header .logo {color: white;padding: 0 1rem;
}
/* 导航样式 */
.navbar ul{display: flex;
}.navbar ul li{font-weight: bold;width: 128px;list-style: none;text-align:center;
}
.navbar ul li a {width: 128px;line-height: 45px;font-size: 1.7rem;color: white;
}
.navbar ul li a:hover{color: #009933;
}
/* 二级菜单样式 */
.navbar ul li ul{position: absolute;display: none;width: 128px;line-height: 45px;
}.navbar ul li ul li{background-color: #3F3D56;
}
/* 悬浮展开二级菜单 */
.navbar ul li ul li a:hover{color: white;
}
.navbar ul li ul li:hover{background-color: #009933;
}.navbar ul li:hover ul{display: block;
}
/* 网站内容*/
.content{margin-top:50px;
}/*让文件下载的文件列表居中显示*/
.download-links {text-align: center; /* 使链接居中 */font-family: 'LiSu', 'STLiti', cursive; /* 尝试使用隶书字体,如果不可用则退回到通用草书字体 */font-style: italic; /* 设置字体为斜体 */
}.download-links ul {list-style: none;padding: 0;margin: 0;display: inline-block; /* 使 <ul> 内容居中对齐 */
}.download-links li {margin: 10px; /* 添加一些间距 */
}.download-links a {font-size: 18px; /* 可以根据需要调整大小 */text-decoration: none;color: #000;
}.download-links a:hover {text-decoration: underline;
}

php列出当前目录下的文件及文件夹

<?php
// 列出当前目录下的所有文件和目录
$files = scandir('.');/*// 只保留文件,过滤掉目录
$files = array_filter($files, function($file) {return is_file($file);
});*/// 打印所有文件名
foreach ($files as $file) {echo $file . '<br>';
}

运行效果如下:

直链下载

这是比较安全的方式,就不给参数,直接使用链接进行文件的下载,即不由用户决定,而是服务器决定。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Head</title><link rel="stylesheet" href="index.css">
</head>
<body>
<div class="header"><a href="index.html" class="logo"><h1>wushiyiwuzhong</h1></a><nav class="navbar"><ul><li><a href="file_index.php">文件功能导航</a></li><li><a href="file_upload.php">文件上传</a></li><li><a href="file_downlaod.php">文件下载</a></li><li><a href="#">文件删除</a></li><li><a href="#">文件读取</a></li><li><a href="#">文件写入</a></li></ul></nav>
</div><div class="download-links"><ul><?php$files = scandir('.');$files = array_filter($files, function($file) {return is_file($file);});foreach ($files as $file) {// 创建下载链接echo '<li><a href="' . htmlspecialchars($file) . '" download>' . htmlspecialchars($file) . '</a></li>';}?></ul>
</div>
</body>
</html>

运行效果如下

随便下载一个文件进行测试

下载成功

直连下载的好处是当用户想下载文件时只能在服务器允许的下载范围里下载,而不能下载其他文件

PS:直连下载的方式中文件命令规则最好不要把文件命名的太像,比如202101.jpg、202102.jpg等等,这种情况攻击者可能会通过枚举遍历的方式下载到一些隐私文件

参数下载

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Head</title><link rel="stylesheet" href="index.css">
</head>
<body>
<div class="header"><a href="index.html" class="logo"><h1>wushiyiwuzhong</h1></a><nav class="navbar"><ul><li><a href="file_index.php">文件功能导航</a></li><li><a href="file_upload.php">文件上传</a></li><li><a href="file_downlaod.php">文件下载</a></li><li><a href="#">文件删除</a></li><li><a href="#">文件读取</a></li><li><a href="#">文件写入</a></li></ul></nav>
</div><div class="download-links"><ul><?php$files = scandir('.');//扫描当前目录$files = array_filter($files, function($file) {return is_file($file);});foreach ($files as $file) {// 创建下载链接,指向 download.php,并传递 filename 参数echo '<li><a href="file_downlaod.php?filename=' . urlencode($file) . '">' . htmlspecialchars($file) . '</a></li>';}?></ul>
</div>
</body>
</html><?php
// 读取 filename 参数
$filename = isset($_GET['filename']) ? $_GET['filename'] : '';// 白名单机制,确保只能下载指定文件夹下的文件
$filePath = './' . $filename;
// 安全性检查,防止目录遍历攻击
if (file_exists($filePath) && is_file($filePath) && preg_match('/^.\//', $filePath)) {// 设置 headersheader('Content-Description: File Transfer');header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename="'.basename($filePath).'"');header('Expires: 0');header('Cache-Control: must-revalidate');header('Pragma: public');header('Content-Length: ' . filesize($filePath));// 清空输出缓冲区并关闭输出缓冲ob_clean();flush();// 发送文件到浏览器readfile($filePath);exit;
}
代码细节解释

1、file_exists($filePath) - 这个函数检查指定路径的文件或目录是否存在。如果文件存在,则返回 true,否则返回 false。

2、is_file($filePath) - 这个函数检查指定路径是否是一个文件。这是一个重要的检查,因为你不希望例如目录被当作文件下载。如果 $filePath 是文件,则返回 true,否则返回 false。

3、preg_match('/^.//', $filePath) - 这个函数执行一个正则表达式匹配,来检查 $filePath 是否符合特定的模式。但是,这里提供的正则表达式 '/^.//' 似乎是有误的。这个表达式中的 . 是正则表达式的一个特殊字符,表示任何单个字符(除了换行符),而 / 表示正斜杠 /。所以,这个表达式实际上会匹配任何以任何单个字符开头,紧跟着一个 / 的字符串。
通常我们希望的是正则表达式能够确保文件路径是在一个特定的目录下,例如 /^downloads//,这样的表达式会匹配所有以 downloads/ 开始的路径。

运行效果如下:

随便下载一个文件进行测试,此时可以明显的看到文件的下载链接里多了一个filename参数

http://localhost:63342/wushiyiwuzhong.com/file_downlaod.php?filename=index.php

这种时候我们可以控制filename参数去下载我们想下载的东西
比如我这里下载网站的上一级目录中的txt文件

我们通过../去下载test.txt

成功下载网站上一级目录的文本文件

总结

可控参数在文件下载功能是比较危险的

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

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

typeof不能检测js对象是否是数组的原因是: typeof会将object, array和null都返回为object

下面哪些方式在同一个窗口下能够检测一个js对象是数组类型? A Array.isArray() B instanceof C typeof D Object.prototype.toString.call() 正确答案:ABD A:Array 为 js 的原生对象,它有一个静态方法:Array.isArray(),能判断参数是否为数组 B:instanceof 运算符返回一个…

【1.0】Go语言介绍及引入

【一】Go语言介绍Go语言是Google公司在2007开发一种静态强类型、编译型语言,并在2009年正式对外发布。静态强类型语言需要先编译再执行比如C、C#、Java等语言需要先将代码编译成不同平台的可执行文件,才能在不同平台上运行需要解释器比如Python、PHP、node.js等语言,将代码边…

smp irq affinity介绍

一、概述硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。kernel 2.4 以后的版本利用可编程中断控制器的特性支持把不同的硬件中断请求(IRQs)分配到特定的 CPU 上,这个绑定技术…

三角形的生命-NVIDIA的逻辑管道

三角形的生命-NVIDIA的逻辑管道 自从突破性的费米架构发布近5年以来,也许是时候刷新其下的主要图形架构了。费米是第一个实现完全可扩展图形引擎的NVIDIA GPU,其核心架构可以在开普勒和麦克斯韦中找到。 本文关注GPU如何工作的图形,尽管一些原理(如着色器程序代码的执行方式…

基于MacOS M2 芯片的Mysql 数据库安装与使用

第一步:MySQL软件下载与安装 1.1 登录网址:https://dev.mysql.com/downloads/mysql/,选择系统:MacOS,版本:8.0.35,或者更新的版本,OS version选择ARM,64-bit,点击下Download1.2 接下来安装软件:双击 mysql-8.0.35-macos13-arm64.dmg,点继续或下一步,使用强密码…

Android深入学习之观察者模式与ViewModel的实现机制

1.观察者模式 Observer Pattern Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义对象间的一种一对多依赖关系,当该对象(subject)改变状态时,所有依赖于它的对象(…

2023-2024 20231404高伟光《计算机基础与程序设计》第七周学习总结

作业信息作业班级 23级14班作业要求 第七周要求作业目标 自主学习计算机概论第八章,学习c语言第六章作业正文 此博客教材内容总结 计算机概论:应用层涉及了数据结构,本章介绍了栈(先进后出),队列(先进先出),列表(线性,无线),树,二叉树(每个节点只有一个父母节点…

从低维空间到高维空间

听了复旦大学李颖洲教授的讲座,记录一下自己的理解。前言 我们通常接触到的维度是 \(1\sim3\) 维,我们的认知大部分都是从这些维度得到的,虽然我们常常会想象高维空间的事物,但是难免有一些不同之处。我们理解一个事物,通常要转换为图像,但是高维空间的事物显然我们无法在…

编程思维—为什么缺乏逻辑的人往往看不到问题的本质?

为什么缺乏逻辑的人往往看不到问题的本质? 柏拉图柏拉图《理想国》中洞穴寓言:在洞穴隐喻中,柏拉图设想一群人居住在洞穴中,他们从出生起就被束缚在洞穴里,只能看到投射到洞穴墙壁上的外界的影子,而无法看到真实的世界。某一天,一个人挣脱了束缚,走出了洞穴,他先是感到…

docker修改宿主机为容器映射的端口

1.先关闭容器root1@ubuntu22:~$ docker stop 0912.再停止docker服务root1@ubuntu22:~$ sudo stop docker3.进入配容器置文件目录修改hostconfig.json文件root@ubuntu22:/var/lib/docker/containers/091302dc373cfa10d414a115276a2a18304052721df6f59c8513839ef478e650# vim hos…

The use of green energy can effectively solve the problem of air pollution

The use of green energy can effectively solve the problem of air pollution 一、the operation of green energy Green energy refers to a way of producing and consuming non-polluting or less polluting energy sources such as renewable energy and clean energy.…

安全测试工具集合

更多技术请关注微信公众号:程序员技术前沿

使用rancher rke快速安装k8s集群

概述 Rancher Kubernetes Engine(RKE)是一个用于部署、管理和运行Kubernetes集群的开源工具。旨在简化Kubernetes集群的部署和操作。 RKE具有以下特点和功能: 简化的部署过程 RKE提供了一个简单的命令行界面,使您可以轻松地部署一个完整的Kubernetes集群。您只需提供少量的…

celery清除堆积的任务

在正常启动worker命令后面加上--purge

Oracle找出所有表字段中值包含中文并生成扩充字段的SQL脚本

Oracle找出所有表字段中值包含中文并生成扩充字段的SQL脚本背景 后续计划将Oracle的某个库迁移到云上的达梦库,Oracle字符集为ZHS16GBK,达梦库字符集为UTF-8。 我们知道,中文汉字在UTF8中一个汉字占3个字节,而在GBK中则是占2个字节,测试过程发现若字段中存有中文的行,有可…

Html 表格 在线转 Markdown

复制 HTML Table F12 查看网页源代码Html to markdown 在线转换 https://tableconvert.com/html-to-markdown复制 Markdown还有好多其它的在线转换功能,非常不错本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/17812380.html

读程序员的制胜技笔记08_死磕优化(上)

性能优化1. 过早的优化是万恶之源 1.1. 著名的计算机科学家高德纳(Donald Knuth)的一句名言 1.2. 原话是:“对于约97%的微小优化点,我们应该忽略它们:过早的优化是万恶之源。而对于剩下的关键的3%,我们则不能放弃优化的机会。” 2. 过早优化是提升自己的根源 2.1. 优化就是…

高级计算机体系结构

高级计算机体系结构 芯片堆叠DRAM(3D-DRAM) •叠片DRAM: •顶层存储数据 •底层逻辑层存储各种控制、访问和接口电路 •魔法:堆叠表示高 密度,所以高的b/w插入器集成不那么昂贵。 •当前产品: •混合存储立方体(微米) •高带宽内存(三星、AMD和海力士) •权衡: •延…

Pset_BuildingUse

Pset_BuildingUse 建筑用途:提供当前和预期感兴趣建筑的房地产背景信息。NameTypeDescriptionMarketCategory P_SINGLEVALUE / IfcLabelMarket Category Category of use e.g. residential, commercial, recreation etc.CategorieMarche Catgorie dusage (rsidentiel, commerc…
推荐文章