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

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

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第1张图片

#知识点:

1、PHP文件管理-显示&上传功能实现
2、文件上传-$_FILES&过滤机制实现
3、文件显示-目录遍历&过滤机制实现

演示案例:

➢文件管理模块-上传-过滤机制
➢文件管理模块-显示-过滤机制

#文件管理模块-上传-过滤机制

1、无过滤机制
2、黑名单过滤机制
3、白名单过滤机制
4、文件类型过滤机制

$_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。
$_FILES[“表单值”][“name”] 获取上传文件原始名称
$_FILES[“表单值”][“type”] 获取上传文件MIME类型
$_FILES[“表单值”][“size”] 获取上传文件字节单位大小
$_FILES[“表单值”][“tmp_name”] 获取上传的临时副本文件名
$_FILES[“表单值”][“error”] 获取上传时发生的错误代码
move_uploaded_file() 将上传的文件移动到指定位置的函数

上传功能的实现

  • 创建upload.php和upload.html(chatGPT就好)
    • enctype="multipart/form-data" 告诉服务器,表单中包含了文件上传的数据,并且服务器需要以二进制格式解析这些数据。这样可以确保文件等二进制数据能够正确地传输到服务器

<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>
  • upload.php的实现并在项目创建新的目录,upload来存放上传的内容


// 从上传文件数组中获取文件名
$name = $_FILES['f']['name'];
// 从上传文件数组中获取文件类型
$type = $_FILES['f']['type'];
// 从上传文件数组中获取文件大小
$size = $_FILES['f']['size'];
// 从上传文件数组中获取临时文件名
$tmp_name = $_FILES['f']['tmp_name'];
// 从上传文件数组中获取错误码
$error = $_FILES['f']['error'];

// 输出文件名
echo $name . "
"
; // 输出文件类型 echo $type . "
"
; // 输出文件大小 echo $size . "
"
; // 输出临时文件名 echo $tmp_name . "
"
; // 输出错误码 echo $error . "
"
; **// 如果成功将临时文件移动到指定目录,则输出文件上传成功 if (move_uploaded_file($tmp_name, 'upload/' . $name)) { echo "文件上传成功!"; }** ?>

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第2张图片

黑名单过滤机制

  • 使用 explode 函数通过点号分割文件名,获取文件后缀
  • 使用 end 函数获取数组中的最后一个元素,即文件后缀
  • 检查文件后缀是否在黑名单中
    • 如果文件后缀在黑名单中,输出非法后缀文件信息
    • 如果文件后缀不在黑名单中,移动上传的文件到指定目录
    • 输出上传成功的提示信息
// 上传文件后缀过滤,使用黑名单机制
$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 "";
}
?>

Untitled

问题:如果过滤机制的后缀名没有考虑其他限制如**.php5之类的,还是可以进行绕过黑名单**,正常进行上传和下载

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第3张图片

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第4张图片

白名单过滤机制

  • 基本和黑名单一样简单修改即可
  • 只能上传白名单相符的后缀
//白名单过滤机制
**// 允许上传的文件后缀白名单
$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 "";
}

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第5张图片

文件类型过滤机制

发现在上传文件时候,

  • 如果是图片在抓包内容Content-Type: image/png
  • 如果是exe文件抓包内容Content-Type: application/x-msdownload

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第6张图片

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第7张图片

  • 可以通过限制文件类型去过滤内容
//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 '';
}
  • 安全问题
    • 如果被抓包抓到数据包,并修改Content-Type内容 则也可以绕过筛查 正常进行上传和下载

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第8张图片

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第9张图片

024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第10张图片

#文件管理模块-显示-过滤机制

功能:显示 上传 下载 删除 编辑 包含等
1.打开目录读取文件列表
2.递归循环读取文件列表
3.判断是文件还是文件夹
4.PHP.INI目录访问控制

opendir() readdir() 区别

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);
    
    

使用示例

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

while (($file = readdir($dir_handle)) !== false) {
    echo $file . '
'
; } closedir($dir_handle);

上述示例演示了如何使用 opendir() 打开目录,然后使用 readdir() 循环读取目录中的文件和目录,最后使用 closedir() 关闭目录句柄。

创建file-manage.php中

  • 打开目录读取文件列表
  • 递归循环读取文件列表
  • 判断是文件还是文件夹

总结:

  • **while**循环迭代目录中的每个条目。
  • **readdir($dh)**读取目录中的下一个条目。
  • 循环继续,直到没有更多的条目(readdir返回false)。
  • 在循环内部,**is_dir($dir . '/' . $file)检查当前目录项是否是一个目录,通过构建完整路径并使用is_dir**函数来判断。
    • 条件通过使用斜杠(/)将目录路径($dir)与当前目录项($file)连接起来,形成完整的路径。

// 获取要显示的目录,默认为当前目录
$dir = $_GET['path'] ?? './';

// 打开目录,读取文件列表 opendir
function filelist($dir){
    // 判断目录是否存在
    if ($dh = opendir($dir)) {
        // 循环读取文件列表 while readdir
        **while (($file = readdir($dh)) !== false) {
            // 判断是文件还是文件夹 is_dir
            if (is_dir($dir . '/' . $file)) {
                // 如果是文件夹,显示文件夹图标和链接
                echo "
  • " . $file . '
  • '
    ; } else { // 如果是文件,显示文件图标和链接 echo '
  • ' . $file . '
  • '
    ; } } // 关闭目录句柄 closedir($dh); }** } // 调用函数显示目录文件列表 filelist($dir); ?>

    PHP.INI目录访问控制

    • 开启权限控制之前

      • 使用**../**或者**c:/等依旧可以访问到目标服务器的所有文件目录**

      024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第11张图片

    • G:\develop\safety\phpstudy_pro\Extensions\php\php7.0.9nts

    • 在目标文件夹出设置访问控制的的权限:**open_basedir =G:\develop\safety\phpstudy_pro\WWW 注意取消掉前面的封号才能启用该功能**

    • 保存并重启小皮,发现WWW以外的目录均报错不能访问

    024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第12张图片

    024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第13张图片

    024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第14张图片

    024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第15张图片

    • 也可以在显示目录文件处怎加对于一些特定访问的符号制定黑名单
      • ../ 等,
      • 但是任然有办法访问例如换为**..\ …/**等

    024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第16张图片

    024-安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制_第17张图片

    你可能感兴趣的:(安全,php,开发语言,web安全)