024-安全开发-PHP开发PDF&课堂源码打包等

#知识点:
1、PHP文件管理-显示&上传功能实现
2、文件上传-$_FILES&过滤机制实现
3、文件显示-目录遍历&过滤机制实现
文件管理模块-上传-过滤机制
1、上传功能的实现
- 使用gpt生成一个美观的upload.html上传页面
php1 2 3 4 5 6 7 8 9 10 11 12
| upload.html代码 <body> <div class="upload-box"> <h2>文件上传示例</h2> <form action="upload.php" method="post" enctype="multipart/form-data"> <p>选择要上传的文件:</p> <input type="file" name="uploaded_file"> <br> <input type="submit" class="btn" value="上传文件" name="submit"> </form> </div> </body>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| $name = $_FILES['uploaded_file']['name'];
$type = $_FILES['uploaded_file']['type'];
$size = $_FILES['uploaded_file']['size'];
$tmp_name = $_FILES['uploaded_file']['tmp_name'];
$error = $_FILES['uploaded_file']['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、黑名单过滤机制
- 使用 explode 函数通过点号分割文件名,获取文件后缀
- 使用 end 函数获取数组中的最后一个元素,即文件后缀
- 检查文件后缀是否在黑名单中
- 如果文件后缀在黑名单中,输出非法后缀文件信息
- 如果文件后缀不在黑名单中,移动上传的文件到指定目录
- 输出上传成功的提示信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $black_ext = array('php', 'asp', 'jsp', 'aspx');
$fenge = explode('.', $name);
$exts = end($fenge);
if (in_array($exts, $black_ext)) { echo '非法后缀文件' . $exts; } else { move_uploaded_file($tmp_name, 'upload/' . $name); echo "<script>alert('上传成功!')</script>"; }
|

如果过滤机制的后缀名没有考虑其他限制如.php5之类的,还是可以进行绕过黑名单**,**正常进行上传和下载
3、白名单过滤机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ** $allow_ext = array('png', 'jpg', 'gif', 'jpeg');**
$fenge = explode('.', $name);
$exts = end($fenge);
**if (!in_array($exts, $allow_ext)) { echo '非法后缀文件' . $exts;** } else { move_uploaded_file($tmp_name, 'upload/' . $name); echo "<script>alert('上传成功!')</script>"; }
|

1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ** $allow_type = array('image/png', 'image/jpg', 'image/jpeg', 'image/gif');**
if (!in_array($type, $allow_type)) { echo '非法文件类型'; } else { move_uploaded_file($tmp_name, 'upload/' . $name); echo '<script>alert("上传成功")</script>'; }
|
文件管理模块-显示-过滤机制
功能:显示 上传 下载 删除 编辑 包含等
1.打开目录读取文件列表
2.递归循环读取文件列表
3.判断是文件还是文件夹
4.PHP.INI目录访问控制
opendir() readdir() 区别
is_dir() 函数用于检查指定的路径是否是一个目录(文件夹)
opendir() 函数用于打开指定的目录,返回句柄,用来读取目录中的文件和子目录
readdir() 函数用于从打开的目录句柄中读取目录中的文件和子目录
open_basedir:PHP.INI中的设置用来控制脚本程序访问目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?php
$dir = $_GET['path'] ?? './';
function filelist($dir){ if ($dh = opendir($dir)) { **while (($file = readdir($dh)) !== false) { if (is_dir($dir . '/' . $file)) { echo "<li><i class='fa fa-folder'></i> <a href='?path=$dir/$file'>" . $file . '</a></li>'; } else { echo '<li><i class="fa fa-file"></i> <a href="#">' . $file . '</a></li>'; } } closedir($dh); }** }
filelist($dir); ?>
|
while循环迭代目录中的每个条目。
**readdir($dh)**读取目录中的下一个条目。
循环继续,直到没有更多的条目(readdir返回false)。
在循环内部,is_dir($dir . ‘/‘ . $file)检查当前目录项是否是一个目录,通过构建完整路径并使用is_dir函数来判断。
条件通过使用斜杠(/)将目录路径($dir)与当前目录项($file)连接起来,形成完整的路径。
PHP.INI目录访问控制
- 开启权限控制之前 使用
**../**或者**c:/等依旧可以访问到目标服务器的所有文件目录