php开发-个人博客项目文件操作类编辑器上传下载删除读写

本文主要是介绍php开发-个人博客项目文件操作类编辑器上传下载删除读写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

特地整了个软件

这就舒服了

文件操作类的开发

文件的任意上传,下载,读取,删除操作等

1.文件上传类-任意文件上传

分为三类

1,代码自主编写的

先写一个html的上传表单,这个网上搜索就有

标题看着不够明确啊,在加个标题  h1

html用来构造前端的接受界面,然后在用php去处理

$_FILES数组内容如下: 
$_FILES['myFile']['name'] 客户端文件的原名称。 
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。 
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。 
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。 
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量) 

随便上传一个文件,就看到了刚刚获取到的信息

能正常接收之后在创建一个接受图片存放文件夹,就命名upload吧

//ove_uploaded_file移动文件的函数,第一改是要移动的文件
//第二个是要移动到那个目录,以及命名

提示成功,也有位置回显

这是没有任何拦截的情况下,但现实中都有拦截的,我们再加些检测的代码

判断类型是否是jpeg,不是就输出文件类型不支持

上传不同类型的文件就会不支持

2,编译器引用造成的

第二中类型,就是网站引用了编译器,很多网站都引用编译器的

编译器简单就是第三方应用,一个小软件,继承了一些功能,不用敲代码打出来了

 源码下载地址

Release 发布 v1.4.3.3 · fex-team/ueditor · GitHub

直接复制粘贴网上的代码

上面就多了一个编译器

当引用了编译器。如果编译器没有漏洞,就没有办法进行文件上传,编译器是引用的第三方别人写好的,不是博主自己写的代码,如果编译器有漏洞,博主的网站就有漏洞

3,框架类上传漏洞

出现漏洞的问题

1.自写代码验证上传 //验证核心在代码里面

2.引用外部编译器实现,//验证核心在编译器里面

3.引用开发框架实现,//验证核心在代码框架里面


1.文件上传类-任意文件上传

下载方式分为两种,一种是直连下载,如http://www.xiaodi.com/data.zip

一种是传参下载,如http://www.xiaodi.com/down.php?filename=data.zip

直连下载

访问目录就看到了这里的内容

然后可以通过数组遍历把这里面的东西取出来

取出我们要下载的东西

现在在构造一个下载函数,下载函数哪里就用到了$_sever函数,获取一些分为信息构造分为的url

构造好输出的url就是一个正常的url

传参的话就写成这样

接受变量name,并把变量传递到url里面组成,name就是用户可控的变量就可以自己输出想下载内容

html接受post提交的name值。传递给变量name,在写给url,就构造出来url

最后在补全代码测试下载效果

就会自动提示下载

直连下载代码过程html表单接受post提交的数据,传参给下载函数,创造出下载的url,重定向到那个函数下载

这是直连下载

相对直连下载的安全问题就很小,因为直连下载是因为分为的zip文件,zip文件的协议不同会直接下载,不会触发浏览器的自动下载,而访问php文件就会直接执行php,并不会下载

传参下载

而传参下载是功能下载,传参会读取文件夹的所有内容,这时候在访问文件夹里面的文件不会收到协议什么的影响,访问什么,就下载什么,访问php也是下载,所以传参下载会有安全问题

 1.文件上传类-任意文件删除

文件的删除代码对文件下载稍微改几个字即可,然后写一个文件删除的函数

文件删除代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件删除操作</title></head>
<body>
<hr>
<h1>文件删除</h1>
<?php getfilename();?>
<form action="" method="post" enctype="multipart/form-data"><input type="text"  name="name" /> <br /><input type="submit" value="删除文件" />
</form>
<?php $name=$_POST['name'];delfilename($name);?><br />
<?php getfilename();?>
<form action="" method="post" enctype="multipart/form-data"><input type="text"  name="dir" /> <br /><input type="submit" value="删除文件夹" />
</form>
<h1>文件夹删除</h1>
<?php $dir=$_POST['dir'];deifiledir($dir);?>
</body>
</html><?php
function getfilename()
{  //function 声明函数。后面是命名$filepath = getcwd();  //读取当前目录$filename = scandir($filepath);  //扫描指定目录foreach ($filename as $value) { //foreach数组遍历方法if ($value != '.' && $value != '..') {$arr[] = $value;echo $value . '<br>';}}
}
function delfilename($name){unlink($name); //删除文件
}
function deifiledir($dir){rmdir($dir); //删除文件夹
}

不过这个只能删除本目录的,就代码所在的目录

输出1.txt

就没了

经测试发现删除文件夹需要文件夹是空的才可以使用这个代码删除

 1.文件上传类-任意文件读取写入

还是那段html代码改几个字就好

读到的结果是3

写入文件也是成功写入

代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件读写操作</title></head>
<body>
<hr>
<?php getfilename();?>
<h1>文件读取</h1>
<form action="" method="post" enctype="multipart/form-data"><input type="text"  name="name" /> <br /><input type="submit" value="读取文件" />
</form>
<?php $name=$_POST['name'];getfileread($name);?><br />
<h1>文件写入</h1>
<form action="" method="post" enctype="multipart/form-data">需要写入的文件:<input type="text"  name="name" /> <br />需要写入的代码:<input type="text"  name="txt" /> <br /><input type="submit" value="写入文件" />
</form>
<?php $name=$_POST['name'];$txt=$_POST['txt'];filewrite($name,$txt);?><br /></body>
</html><?php
function getfilename()
{  //function 声明函数。后面是命名$filepath = getcwd();  //读取当前目录$filename = scandir($filepath);  //扫描指定目录foreach ($filename as $value) { //foreach数组遍历方法if ($value != '.' && $value != '..') {$arr[] = $value;echo $value . '<br>';}}
}
function getfileread($name){$file = fopen("$name","r"); //fopen打开文件函数,r是模式,r的意思是只读echo $contents = fread($file,filesize("$name")); //输出一下读取的内容fclose($file);
}
function filewrite($name,$txt){$myfile = fopen("$name","a+"); //fopen打开文件函数,a+是模式,a+的意思是写入,如果没有写入的文件就创建再写入fwrite($myfile,$txt);fclose($myfile);
}

这些漏洞产生的前提一定要有一个可控的参数,不然就不会有漏洞,比如直连下载根本没有可控的参数,怎么产生漏洞

文件包含漏洞

漏洞函数

include

1.txt的内容是phpinfo()

而访问这个php文件就会展示phpinfo的界面

文件包含漏洞又分远程包含和本地包含,这里是固定参数的,如果那个包含的文件名字是我们可控的参数就可以尝试文件包含漏洞,远程包含漏洞可以直接去执行别的网站的文件,自己开一个服务器,自定义个反弹shell文件去远程包含,那危害相当大

include之外require也可以是文件包含的漏洞函数

漏洞成因

可控的参数

漏洞函数-函数的多样化

ping

an

这篇关于php开发-个人博客项目文件操作类编辑器上传下载删除读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974511

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表