文件操作(PHP)(小迪网络安全笔记~

免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!!
附:完整笔记目录~
ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!

1.6 🐘文件操作(PHP)

  1. 引子:本章对PHP项目中主要的文件操作函数做一介绍,当然由于$_FILES全局变量已在第一章介绍过,因此不再提及。

  2. 目录查看

    目录查看就是通过php函数查看当前项目所使用目录下存在的目录和文件,有些类似于Win&Linux中的dir&ls。常用的目录查看函数包括readdir()、scandir()等。

    readdir():

    php 复制代码
    <?php
    // opendir()用于返回一个已打开的目录句柄
    $dir = opendir('../');
    // readdir()通过目录句柄逐个读取目录内容
    while (($file = readdir($dir)) !== false) {
        echo $file.'<br>';
    }
    // closedir()用于关闭打开的目录句柄,释放资源
    closedir($dir);

    Result:

    scandir():

    php 复制代码
    <?php
    // scandir用于返回指定目录中文件&子目录的数组
    // 相较于readdir(),更加简洁
    $files = scandir('../');
    foreach ($files as $file) {
        echo $file.'<br>';
    }

    Result:同上。

  3. 文件读取

    常用的文件读取函数包括fgetc()、fgets()、fread()、file()、file_get_contents()等,同样我们通过简单的demo来测试一下。

    fgetc()&fgets()&fread():

    php 复制代码
    <?php
    // fopen()返回一个已打开的文件句柄
    $handle = fopen("test.php", 'r');
    
    // fgetc()每次读取一个字符并返回
    /*while (($char = fgetc($handle)) !== false) {
        echo $char.'<br>';
    }*/
    /*var_dump(fgetc($handle));
    // bool(false)*/
    // 当该文件读完后,此时文件句柄(也就是文件指针)
    // 已指向文件末尾,因此当执行其它f~函数时
    // 需注释掉上段操作
    
    // fgets()每次读取一行文本并返回
    /*while (($line = fgets($handle)) !== false) {
        echo $line.'<hr>';
    }*/
    
    // fread()读取开发者指定长度的内容
    // filesize()读取指定文件大小(字节)
    $contents = fread($handle, filesize("test.php"));
    echo $contents;
    
    // 关闭句柄,释放资源
    fclose($handle);

    file()&file_get_contents():

    php 复制代码
    <?php
    // file()用于读取整个文件,
    // 并将读取到的内容按行存放至数组中
    $lines = file("test.php");
    var_dump($lines);
    foreach ($lines as $line) {
        echo $line;
    }
    
    // file_get_contents()用于读取整个文件
    // 并将读取到的内容作为字符串返回
    $contents = file_get_contents("test.php");
    echo $contents;

    由这两段demo可以很明显的感觉到,第一段demo针对需读取的文件内容是一部分一部分读,而第二段demo则会将整个文件内容都加载。至于孰优孰劣,可能得依实际情况而定了。

    补:readfile():

    php 复制代码
    <?php
    // readfile()用于读取文件内容并将其直接加载至浏览器中
    // 常被应用于文件下载
    readfile("test.php");
  4. 文件下载

    demo:

    php 复制代码
    <?php
    // 设置要下载的文件路径
    $file = './Hua~.png';
    
    // 设置返回头信息实现文件下载
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    
    // 上述所设头部信息仅是告诉浏览器当用户发起请求时执行文件下载操作
    // 但浏览器自身并不知晓该下载什么文件
    // 因此需要通过文件读取函数,先将文件内容返回到浏览器,再由浏览器执行下载操作
    readfile($file);
  5. 文件删除

    常见的文件删除函数为unlink(),demo:

    php 复制代码
    <?php
    $file = './test.php';
    
    // unlink()文件删除函数,用于删除指定路径下的文件,
    // 若成功删除则返回true
    if (unlink($file)) {
        echo '删除成功!';
    }else{
        echo '您无权删除该文件!';
    }
  6. 文件包含

    文件包含指,在php中可将被包含文件嵌入至当前脚本中并执行,提升了代码的复用性。常见的文件包含函数包括include()、require()、include_once()、require_once()等。

    demo:

    php 复制代码
    <?php
    echo "Hello ^_^~" . '<hr>';
    
    // 若include()包含文件不存在&无法访问,则会抛出警告但仍继续执行
    include('test.php');
    
    // 若require()~,则会抛出错误并终止执行
    require('test.txt');
    
    // include_once()与include()功能相同
    // 不过,它可检查当前文件是否已被包含,若已包含则不会再执行包含操作
    include_once('test.php');
    
    // require_once()同上
    require_once('test.txt');

    在文件包含中还有一个有意思的点,当被包含文件为文本文件时(.txt),此时若文件内容为php或html代码,则当包含该文件的脚本被执行时,其中的代码也会被执行。

    举个例子,当上述代码段中test.txt中的内容为:

    latex 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <body>
        <h1>Hello sjjjer!</h1>
    </body>
    </html>
    <?php
    echo "^_^~".'<hr>';

    Result:

由这些文件操作函数导致的安全问题往往为,若传递给这些函数的参数用户可控,从而造成的任意文件读取&下载&删除&包含等。这里再引用一句小迪老师对于常见由Web端产生安全问题的总结,

安全问题 ⇔ 不安全的代码逻辑 + 用户可控的参数

至此,本章内容结束!

相关推荐
码智社35 分钟前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海37 分钟前
python 列表、元组、集合和字典
开发语言·python
克里斯蒂亚诺更新43 分钟前
ruoyi角色权限的对应关系
笔记
萧瑟余晖2 小时前
JDK 26 新特性详解
java·开发语言
马优晨2 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
andxe2 小时前
安科士 AndXe 技术博客:400G QSFP112 SR4 光模块|AI 算力与超算短距互联最优方案
网络·人工智能·光模块·光通信
shiyi.十一3 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
a1117763 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
DFT计算杂谈4 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
人邮异步社区4 小时前
怎么把C语言学到精通?
c语言·开发语言