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

发布于:2024-05-10 ⋅ 阅读:(33) ⋅ 点赞:(0)

特地整了个软件

这就舒服了

文件操作类的开发

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

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