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

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

1.6 🐘文件操作(PHP)

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

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

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

    Result:
    image-20250216200853102

    scandir():

    <?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
    // 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
    // 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
    // readfile()用于读取文件内容并将其直接加载至浏览器中
    // 常被应用于文件下载
    readfile("test.php");
    
  4. 文件下载
    demo:

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

    <?php
    $file = './test.php';
    
    // unlink()文件删除函数,用于删除指定路径下的文件,
    // 若成功删除则返回true
    if (unlink($file)) {
        echo '删除成功!';
    }else{
        echo '您无权删除该文件!';
    }
    
  6. 文件包含
    文件包含指,在php中可将被包含文件嵌入至当前脚本中并执行,提升了代码的复用性。常见的文件包含函数包括include()、require()、include_once()、require_once()等。
    demo:

    <?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中的内容为:

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

    Result:
    image-20250217203912048

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【分治法】棋盘覆盖问题 C/C++(附代码和测试实例及算法分析)

问题描述 在一个 2 k 2 k 2^k \times 2^k 2k2k大小的棋盘中&#xff0c;有一个与其他方块不同的特殊方块&#xff0c;如下图红色方块。另有4种形态不同的L型骨块&#xff08;见下图&#xff09;&#xff0c;要用图示四种骨块覆盖棋盘上除特殊方格外的其他所有方格&#xff0c…

el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩

问题&#xff1a;明明子级只有一条数据&#xff0c;还显示箭头号 原因&#xff1a;最开始row-key写的是id,父级和子级都有该属性&#xff0c;所以展开失效了。 解决方法&#xff1a;row-key&#xff1a;id改成 row-key"name"

2002-2019年各省人口老龄化程度数据

2002-2019年各省人口老龄化程度数据 1、时间&#xff1a;2002-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;地区、年度、六十五岁以上占比 4、范围&#xff1a;31省 5、指标解释&#xff1a;人口老龄化是指人口生育率降低和人均寿命延长导致的总人…

面向机器学习的Java库与平台简介、适用场景、官方网站、社区网址

Java机器学习的库与平台 最近听到有的人说要做机器学习就一定要学Python&#xff0c;我想他们掌握的知道还不够系统全面。本文作者给大家介绍几种常用Java实现的机器学习库&#xff0c;快快收藏加关注吧&#xff5e; Java机器学习库表格 Java机器学习库整理库/平台概念适合场…

MySQL 之服务器配置和状态(MySQL Server Configuration and Status)

MySQL 之服务器配置和状态 1 MySQL 架构和性能优化 1.3 服务器配置和状态 设置 MySQL 服务的特性&#xff0c;可以通过 mysqld 服务选项&#xff0c;服务器系统变量和服务器状态变量这三个方面来进行设置和查看。 官方文档 https://dev.mysql.com/doc/refman/8.0/en/serve…

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇&#xff1a;Linxu的基础指令和环境部署&#xff0c;项目部署实战&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…

LabVIEW无刷电机控制器检测系统

开发了一种基于LabVIEW的无刷电机控制器检测系统。由于无刷电机具有高效率、低能耗等优点&#xff0c;在电动领域有取代传统电机的趋势&#xff0c;而无刷电机的核心部件无刷电机控制器产量也在不断增长。然而&#xff0c;无刷电机控制器的出厂检测仍处于半自动化状态&#xff…

《仙台有树》里的馅料(序)

《仙台有树》一起追剧吧&#xff08;二&#xff09;&#xff1a;馅料合集概览 ●德爱武美玩&#xff0c;全面发展 ●猜猜我是谁&真假美清歌 ●失忆的风还是吹到了仙台 ●霸道师徒强制收&你拜我&#xff0c;我拜你&#xff0c;师徒徒师甜蜜蜜 ●霸道总裁强制爱 ●仙台有…

网站搭建基本流程

需求分析&#xff1a; 实现网站搭建的过程&#xff1a;首先进行网站的需求性分析 网站可分为前台系统和后台系统&#xff0c;由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块&#xff1a; 在编写代码前&#xff0c;我们要先对网站进行架构&#xff0c;通过…

反射机制的简单示例

一个使用反射机制的简单示例&#xff0c;这个示例将展示如何使用反射来实现一个通用的数据导出功能。 首先&#xff0c;让我们创建必要的项目结构和文件&#xff1a; 首先修改 pom.xml 添加依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

Qt:多元素控件

目录 多元素控件介绍 QListWidget QTableWidget QTreeWidget 多元素控件介绍 多元素控件表示这个控件中包含了很多的元素&#xff0c;元素可能指的是字符串&#xff0c;也可以指的是更加复杂的数据结构、图片等等 Qt 中提供的多元素控件有: QListWidgetQListViewQTableW…

DeepSeek 助力 Vue 开发:打造丝滑的范围选择器(Range Picker)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)

目录 一、B2109 统计数字字符个数 - 洛谷 算法代码&#xff1a; 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录&#xff1a; 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一&#xff1a;算法代…

Golang GORM系列:GORM并发与连接池

GORM 是一个流行的 Go 语言 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;用于简化数据库操作。它支持连接池和并发访问功能&#xff0c;这些功能对于高性能、高并发的应用场景非常重要。本文结合示例详细介绍gorm的并发处理能力&#xff0c;以及如何是哟个连接池提升…

C#之上位机开发---------C#通信库及WPF的简单实践

〇、上位机&#xff0c;分层架构 界面层 要实现的功能&#xff1a; 展示数据 获取数据 发送数据 数据层 要实现的功能&#xff1a; 转换数据 打包数据 存取数据 通信层 要实现的功能&#xff1a; 打开连接 关闭连接 读取数据 写入数据 实体类 作用&#xff1a; 封装数据…

Ubuntu24安装MongoDB(解压版)

目录 0.需求说明1.环境检查2.下载软件2.1.下载MongoDB服务端2.2.下载MongoDB连接工具(可略过)2.3.检查上传或下载的安装包 3.安装MongoDB3.1.编辑系统服务3.2.启动服务3.3.客户端连接验证3.3.1.创建管理员用户 4.远程访问4.1.开启远程访问4.2.开放防火墙 0.需求说明 问&#x…

《DeepSeek-V3:人工智能大语言模型》

《DeepSeek-V3:人工智能大语言模型》 1. 引言 我们介绍了 DeepSeek-V3,这是一个强大的专家混合 (MoE) 语言模型,总共有 671B 个参数,每个令牌激活了 37B。 为了实现高效的推理和具有成本效益的训练,DeepSeek-V3 采用了多头潜在注意力 (MLA) 和 DeepSeekMoE 架构,这些…

解锁机器学习核心算法 | K -近邻算法:机器学习的神奇钥匙

一、引言 今天我们继续学习机器学习核心算法 —— K - 近邻&#xff08;K-Nearest Neighbors&#xff0c;简称 KNN&#xff09;算法。它就像是一位经验丰富的 “老江湖”&#xff0c;以其简单而又强大的方式&#xff0c;在众多机器学习任务中占据着不可或缺的地位。 K - 近邻…

算法分析—— 《归并排序》

《排序数组》 题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a;nums [5,2…

linux云服务器部署deepseek,并通过网页访问

参考视频&#xff1a;https://www.douyin.com/root/search/linux%E5%AE%89%E8%A3%85%20deepseek?aid3aa2527c-e4f2-4059-b724-ab81a140fa8b&modal_id7468518885570940214&typegeneral 修改ollama配置文件 vim /etc/systemd/system/ollama.service 我的电脑硬盘只有4…