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

本文主要是介绍第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>';
}

这篇关于第24天:安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关