PHP 伪协议:使用 php://filter 为数据流应用过滤器

文章目录

  • 参考
  • 环境
  • PHP 伪协议
      • 概念
      • 为什么需要 PHP 伪协议?
  • php://filter
      • 概念
      • 格式
  • 基本使用
      • 普通读写
          • file_get_contents 与 file_put_contents
          • include
      • 过滤器的基本使用
          • base64 的编码与解码
          • rot13 加解密
            • rot13 算法
            • string.rot13
  • 过滤器列表
      • 多个过滤器的使用
      • 注意事项
  • 处理远程文件
      • allow_url_fopen
          • allow_url_fopen 配置项
          • file_get_contents 与 php://filter
      • allow_url_include
          • allow_url_include 配置项
          • inlcude 与 php://filter

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 官方filesystem.configuration.php
PHP 官方PHP Manual
PHP 官方wrappers.php.php
PHP 官方filters.php

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.2.9
PHP 编辑器PhpStorm 2023.1.1(专业版)

PHP 伪协议

概念

在 PHP 中,伪协议(Pseudo Protocols) 也被称为 流包装器,这些伪协议以 php:// 开头,后面跟着一些参数,用于指定 要执行的操作需要访问的资源
伪协议表明这些协议并不是一个 真实的外部协议,例如 httpftp。PHP 伪协议的出现是为了提供一个 统一的简洁的 接口来处理 不同的数据流。这些伪协议可以被看作是一种 桥梁,它们允许开发者 使用常规的文件操作函数来处理各种不同的数据流

为什么需要 PHP 伪协议?

PHP 所提供的伪协议带来的优点整理如下:

项目描述
一致性开发者 不必为不同的数据流编写特定的处理代码。通过使用伪协议,开发者能够使用 熟悉的标准的 文件操作函数来处理各种数据。
灵活性伪协议提供了 多种不同的方式来访问和处理数据例如,您可以使用 php://stdinphp://stdout 来处理标准输入和标准输出;使用 php://memoryphp://temp 来在内存中或临时文件中处理数据。这种灵活性允许开发人员根据具体需求选择最合适的方式来处理数据。
优化工作流php://input 伪协议可以 直接读取原始的 POST 数据,而不需要依赖特定的全局变量,这样可以在不同的上下文中更灵活地处理输入数据;php://tempphp://memory 伪协议允许在内存中 创建临时数据流,而 无需实际文件存储。这对于处理临时数据或进行中间数据处理非常有用,而 不会产生硬盘 I/O开销。

php://filter

概念

php://filter 的主要作用是提供一种机制,让您可以轻松地 在数据流上应用一个或多个过滤器

格式

php://filter 的基本格式如下:

php://filter/read=?/resource=?

其中:

项目描述
resourcephp://filter 中,resource 参数是必须的。resource 用于指定 需要进行筛选过滤的数据流
readread 参数指定 一个或多个过滤器 用于 操作,多个过滤器之间以管道符 | 进行分隔。
writewrite 参数指定 一个或多个过滤器 用于 操作,多个过滤器之间以管道符 | 进行分隔。

注:

任何没有以 read=write= 作前缀的筛选器列表会 视情况应用于读或写操作。这意味着在指定筛选器的过程中,readwrite 参数可被省略。

基本使用

普通读写

file_get_contents 与 file_put_contents

在使用 php://filter 伪协议的过程中,省略 read=write=过滤器列表 将能够实现对数据的 普通(不使用过滤器) 读写操作。

<?php# 省略过滤器列表实现文本的普通读写操作# 通过 php://filter 伪协议指定需要写入数据的文件
file_put_contents('php://filter/resource=file.txt', 'Hello World');
# 通过 php://filter 伪协议指定需要读取数据的文件
$content = file_get_contents('php://filter/resource=file.txt');var_dump($content);

执行效果

由于在使用 php://filter 伪协议的过程中没有指定需要使用到的过滤器,PHP 抛出了 Warning 异常。

string(11) "Hello World"
PHP Warning:  file_put_contents(): Unable to locate filter "resource=file.txt" in C:\index.php on line 7
PHP Warning:  file_put_contents(): Unable to create filter (resource=file.txt) in C:\index.php on line 7
PHP Warning:  file_get_contents(): Unable to locate filter "resource=file.txt" in C:\index.php on line 9
PHP Warning:  file_get_contents(): Unable to create filter (resource=file.txt) in C:\index.php on line 9
include

includerequire 等函数也可用于处理包含 PHP 伪协议的字符串,只不过 include 等函数仅能使用 php://filter 进行读取操作,且 被读取的数据将被包含至当前 PHP 上下文中,作为 PHP 代码进行执行。对此,请参考如下示例:

content.txt 文件中的内容

<?phpvar_dump('Hello World');

示例代码

<?php# 尝试通过 php://filter 协议过滤本地文件中的内容
include('php://filter/resource=./content.txt');

执行效果

由于在使用 php://filter 伪协议的过程中未指定过滤器,故 PHP 抛出了 Warning 异常。
在使用 php://filter 读取 content.txt 文件后,该文件中的内容被 PHP 视为 PHP 代码进行执行。因此输出了 string(11) "Hello World" 而不是输出 content.txt 文件中的实际内容。

PHP Warning:  include(): Unable to locate filter "resource=." in C:\demo.php on line 5
PHP Warning:  include(): Unable to create filter (resource=.) in C:\demo.php on line 5
PHP Warning:  include(): Unable to locate filter "content.txt" in C:\demo.php on line 5
PHP Warning:  include(): Unable to create filter (content.txt) in C:\demo.php on line 5
string(11) "Hello World"

过滤器的基本使用

base64 的编码与解码

convert.base64-encodeconvert.base64-decodephp://filter 所支持的过滤器,使用这两个过滤器等同于使用 base64_encode()base64_decode() 对数据流进行处理。

举个栗子

<?php# 省略 write=
file_put_contents('php://filter/convert.base64-encode/resource=./file.txt', 'Hello World');# 获取 base64 编码后的内容
$content = file_get_contents('php://filter/resource=./file.txt');
var_dump($content);# 通过 convert.base64-decode 过滤器数据流进行 base64 解码操作
$content = file_get_contents('php://filter/read=convert.base64-decode/resource=./file.txt');
var_dump($content);

执行效果

string(16) "SGVsbG8gV29ybGQ="
string(11) "Hello World"
PHP Warning:  file_get_contents(): Unable to locate filter "resource=." in C:\demo.php on line 8
PHP Warning:  file_get_contents(): Unable to create filter (resource=.) in C:\demo.php on line 8
PHP Warning:  file_get_contents(): Unable to locate filter "file.txt" in C:\demo.php on line 8
PHP Warning:  file_get_contents(): Unable to create filter (file.txt) in C:\demo.php on line 8
rot13 加解密
rot13 算法

ROT13(Rotate By 13 Places)是一种简单的 字母替代密码,是 凯撒密码的一种变体。其基本思想是将字母表中的每一个字母移动 13 个位置。因为拉丁字母表有 26 个字母,所以 ROT13 解密 是其自身的 逆运算:即对一个已经 ROT13 加密的文本再次进行 ROT13 加密,将获得加密文本的原始文本

这种加密方法的主要优点是它的简单性和对称性,但显然,ROT13 不提供真正的安全性,因为它很容易破解。事实上,ROT13 经常在在线社区中用作一种简单的方式来 隐藏剧透、答案或轻微的冒犯内容,而不是用作真正的加密手段

string.rot13

通过 php://filter 使用 string.rot13 过滤器即可对数据流进行 rot13 处理。对此,请参考如下示例:

<?php# 对数据流进行 ROT13 加密
file_put_contents('php://filter/write=string.rot13/resource=file.txt', 'Hello World');# 读取数据但不对数据流应用任何过滤器
include('php://filter/resource=./file.txt');
print("\n");# 对数据流进行 ROT13 加密以获取其原文
$content = file_get_contents('php://filter/read=string.rot13/resource=file.txt');
var_dump($content);

执行效果

Uryyb Jbeyq
string(11) "Hello World"
PHP Warning:  include(): Unable to locate filter "resource=." in C:\demo.php on line 8
PHP Warning:  include(): Unable to create filter (resource=.) in C:\demo.php on line 8
PHP Warning:  include(): Unable to locate filter "file.txt" in C:\demo.php on line 8
PHP Warning:  include(): Unable to create filter (file.txt) in C:\demo.php on line 8

过滤器列表

多个过滤器的使用

在为 php://filter 指定过滤器时,可以通过 管道符 | 指定多个过滤器(过滤器列表),这些过滤器将按照 从左至右 的顺序 依次 对数据流进行处理。对此,请参考如下示例:

<?php# 依次对数据流进行 base64 编码处理,rot13 处理。
file_put_contents('php://filter/convert.base64-encode|string.rot13/resource=file.txt', 'Hello World');# 对 file.txt 文件中的内容进行普通读取
$raw_content = file_get_contents('./file.txt');
var_dump($raw_content);# 由于没有先将文件中的内容进行 rot13 处理,直接对其进行解码将无法恢复原数据内容。
var_dump(base64_decode($raw_content));# 先对文件中的内容进行 rot13 处理,再对处理结果进行 base64 解码
$content = file_get_contents('php://filter/string.rot13|convert.base64-decode/resource=./file.txt');
var_dump($content);

执行效果

string(16) "FTIfoT8tI29loTD="
string(11) "2�?-#oe�0"
string(11) "Hello World"

注意事项

在使用 管道符 | 连接多个过滤器时,与管道符之间存在空格的过滤器均将失效。对此,请参考如下示例:

<?php# 两个过滤器与管道符之间均存在空格,故数据将不进行任何处理存入文件 file.txt 中。
file_put_contents('php://filter/convert.base64-encode | string.rot13/resource=file.txt', 'Hello World');# 对 file.txt 文件中的内容进行普通读取
$raw_content = file_get_contents('./file.txt');
var_dump($raw_content);# 由于 string.rot13 与过滤器之间存在空格,
# 故仅有 convert.base64-decode 过滤器生效。
$content = file_get_contents('php://filter/string.rot13 |convert.base64-decode/resource=./file.txt');
var_dump($content === base64_decode($raw_content));# 由于 convert.base64-decode 与过滤器之间存在空格,
# 故仅有 string.rot13 过滤器生效。
$content = file_get_contents('php://filter/string.rot13| convert.base64-decode/resource=./file.txt');
var_dump($content === str_rot13($raw_content));

执行效果

由于管道符 | 与过滤器之间存在空格导致部分过滤器无法正常使用,PHP 抛出 Warning 异常信息尝试对此进行提示。

PHP Warning:  file_put_contents(): Unable to create or locate filter "convert.base64-encode " in C:\demo.php on line 5
PHP Warning:  file_put_contents(): Unable to create filter (convert.base64-encode ) in C:\demo.php on line 5
PHP Warning:  file_put_contents(): Unable to locate filter " string.rot13" in C:\demo.php on line 5
PHP Warning:  file_put_contents(): Unable to create filter ( string.rot13) in C:\demo.php on line 5
PHP Warning:  file_get_contents(): Unable to locate filter "string.rot13 " in C:\demo.php on line 13
PHP Warning:  file_get_contents(): Unable to create filter (string.rot13 ) in C:\demo.php on line 13
PHP Warning:  file_get_contents(): Unable to locate filter " convert.base64-decode" in C:\demo.php on line 18
PHP Warning:  file_get_contents(): Unable to create filter ( convert.base64-decode) in C:\demo.php on line 18
string(11) "Hello World"
bool(true)
bool(true)

注:

实际上,指定过滤器的过程中出现 不必要的空格 而导致过滤器失效的情况并不仅仅存在上面一种。建议在使用 php://filter 为数据流应用过滤器时,不要出现不必要的空格,防止未预料的事情发生。

处理远程文件

您可以在 PHP 支持使用 PHP 伪协议的函数中使用 php://filter 过滤数据流。但如果需要过滤的数据来自于 远程服务器中,则需要重点关注 allow_url_fopenallow_url_include 配置项,这两个配置项将决定这些函数能否成功 访问执行 来自 远程服务器 中的数据。

allow_url_fopen

allow_url_fopen 配置项

allow_url_fopen 是 PHP 中的一个配置选项,它决定了 PHP 是否能够通过 URL (而非本地文件路径) 来打开文件。这个配置选项的值会影响到一些 PHP 中与文件操作相关的函数的行为,例如 fopen()file_get_contents() 。具体来说,当 allow_url_fopen 被设置为 On(开启)时,这些函数可以用来 读取写入远程文件。而当该配置项被设置为 Off(关闭)时,这些函数 只能用于操作本地文件

file_get_contents 与 php://filter

在尝试使用 file_get_contents 函数获取 远程文件 中的内容时,请确保 PHP 已经开启了 allow_url_fopen 配置项,否则 PHP 将抛出 Warning 异常。对此,请参考如下示例:

<?php# 尝试通过 php://filter 对远程文件进行普通读取
$result = file_get_contents('php://filter/resource=http://192.168.1.8t/target');
var_dump($result);

执行效果

PHP Warning:  file_get_contents(php://filter/resource=http://192.168.1.8/target): Failed to open stream: operation failed in C:\demo.php on line 5
bool(false)

目前,allow_url_fopen 在 PHP 各版本中默认情况下均是开启的。若未开启该选项,请尝试通过 PHP 配置文件 php.ini 文件对该配置进行开启。开启该配置后,执行上述示例代码将得到下述结果:

string(33) "<?phpvar_dump('Hello World');
"
PHP Warning:  file_get_contents(): Unable to locate filter "resource=http:" in C:\demo.php on line 5
PHP Warning:  file_get_contents(): Unable to create filter (resource=http:) in C:\demo.php on line 5
PHP Warning:  file_get_contents(): Unable to locate filter "192.168.1.8" in C:\demo.php on line 5
PHP Warning:  file_get_contents(): Unable to create filter (192.168.1.8) in C:\demo.php on line 5
PHP Warning:  file_get_contents(): Unable to locate filter "target" in C:\demo.php on line 5
PHP Warning:  file_get_contents(): Unable to create filter (target) in C:\demo.php on line 5

allow_url_include

allow_url_include 配置项

allow_url_include 是 PHP 的一个配置指令,与 allow_url_fopen 类似,但 allow_url_include 配置专门针对 PHP 的 includeinclude_oncerequirerequire_once 语句。当 allow_url_include 被设置为 On 时,PHP 允许通过 URL 的形式,从远程服务器 包含和执行 PHP 文件。

注:

PHP5.2 开始,allow_url_include 由原先的默认开启转为默认关闭。如果需要使用 include 等函数处理远程文件,请尝试通过 PHP 配置文件 php.ini 或其他方式开启该配置项。

inlcude 与 php://filter

在使用 includeinclude_oncerequirerequire_once 等函数的同时使用 php://filter 伪协议对 远程文件 进行过滤操作将导致远程文件被包含至当前文件中,且 远程文件将被视为 PHP 代码 进行执行。对此,请参考如下示例:

http://192.168.1.8/target

尝试通过浏览器访问 IP 地址为 192.168.1.8 的服务器中的 target 文件,访问结果如下:

示例代码

<?php# 尝试通过 php://filter 协议过滤远程文件中的内容
include('php://filter/resource=http://192.168.1.8/target');

执行效果

由于未指定用于处理数据流的过滤器,PHP 抛出了多个 Warning 异常。
由上述示例的执行结果来看,php://filter 协议成功包含并执行了远程文件中的内容,因此输出了 string(11) "Hello World"

PHP Deprecated:  Directive 'allow_url_include' is deprecated in Unknown on line 0
string(11) "Hello World"
PHP Warning:  include(): Unable to locate filter "resource=http:" in C:\demo.php on line 5
PHP Warning:  include(): Unable to create filter (resource=http:) in C:\demo.php on line 5
PHP Warning:  include(): Unable to locate filter "192.168.1.8" in C:\demo.php on line 5
PHP Warning:  include(): Unable to create filter (192.168.1.8) in C:\demo.php on line 5
PHP Warning:  include(): Unable to locate filter "target" in C:\demo.php on line 5
PHP Warning:  include(): Unable to create filter (target) in C:\demo.php on line 5

若执行上述代码前,allow_url_fopenallow_url_include 配置项未被开启,则示例代码的执行结果将为如下内容:

PHP Warning:  include(php://filter/resource=http://192.168.1.8/target): Failed to open stream: operation failed in C:\demo.php on line 5
PHP Warning:  include(): Failed opening 'php://filter/resource=http://192.168.1.8/target' for inclusion (include_path='.;C:\php\pear') in C:\demo.php on line 5

注:

allow_url_include 的生效依赖于 allow_url_fopen 配置项的开启。具体而言,当 allow_url_includeallow_url_fopen 两个配置项均被开启时,allow_url_include 才能够发挥作用。若仅有 allow_url_include 配置项被开启,则无法发挥 allow_url_include 配置项所起到的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorFlow案例学习:对服装图像进行分类

前言 官方为我们提供了一个 对服装图像进行分类 的案例&#xff0c;方便我们快速学习 学习 预处理数据 案例中有下面这段代码 # 预处理数据&#xff0c;检查训练集中的第一个图像可以看到像素值处于0~255之间 plt.figure() # 创建图像窗口 plt.imshow(train_images[0]) # …

【RabbitMQ】初识消息队列 MQ,基于 Docker 部署 RabbitMQ,探索 RabbitMQ 基本使用,了解常见的消息类型

文章目录 前言一、初识消息队列 MQ1.1 同步通信1.2 异步通信1.3 MQ 常见框架及其对比 二、初识 RabbitMQ2.1 什么是 RabbitMQ2.2 RabbitMQ 的结构 三、基于 Docker 部署 RabbitMQ四、常见的消息类型五、示例&#xff1a;在 Java 代码中通过 RabbitMQ 发送消息5.1 消息发布者5.2…

软件测试「转行」答疑(未完更新中)

⭐ 专栏简介 软件测试行业「转行」答疑&#xff1a; 如果你对于互联网的职业了解一知半解&#xff01;不知道行业的前景如何&#xff1f;对于众说纷纭的引流博主说法不知所措&#xff01;不确定这个行业到底适不适合自己&#xff1f; 那么这一篇文章可以告诉你所有真实答案&a…

【网络安全】关于CTF那些事儿你都知道吗?

关于CTF那些事儿你都知道吗&#xff1f; 前言CTF那些事儿内容简介读者对象专家推荐 本文福利 前言 CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几…

<el-input> textarea文本域显示滚动条(超过高度就自动显示)+ <el-input >不能正常输入,输入了也不能删除的问题

需求&#xff1a;首先是给定高度&#xff0c;输入文本框要自适应这个高度。文本超出高度就会显示滚动条否则不显示。 <el-row class"textarea-row"><el-col :span"3" class"first-row-title">天气</el-col><el-col :span&…

Selenium进行无界面爬虫开发

在网络爬虫开发中&#xff0c;利用Selenium进行无界面浏览器自动化是一种常见且强大的技术。无界面浏览器可以模拟真实用户的行为&#xff0c;解决动态加载页面和JavaScript渲染的问题&#xff0c;给爬虫带来了更大的便利。本文将为您介绍如何利用Selenium进行无界面浏览器自动…

如何绘制Top级美图?20+案例分享

如何绘制Top级美图&#xff1f;20案例分享 #R语言绘图128个 #图表美化47个 工欲善其事&#xff0c;必先利其器&#xff01; R语言绘图爱好者赶紧看过来&#xff01;画图时选择称手的R包&#xff0c;是高效绘制美图的First Step&#xff01;今天分享一波科研美图绘制所需R包…

TensorFlow入门(九、张量及操作函数介绍)

在TensorFlow程序中,所有的数据都由tensor数据结构来代表。即使在计算图中,操作间传递的数据也是Tensor tensor在TensorFlow中并不是直接采用数组的形式,它只是对TensorFlow中计算结果的引用。也就是说在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程 一个…

WebSocket ----苍穹外卖day8

介绍 实现步骤 各个模块详解 OnOpen OnOpen:标记一个方法作为处理WebSocket连接打开的方法 当一个客户端与服务器建立 WebSocket 连接时&#xff0c;服务器会接收到一个连接请求。一旦服务器接受了这个连接请求&#xff0c;一个 WebSocket 连接就会被建立。这时&#xff0c;被…

Git仓库迁移记录

背景&#xff1a;gitlab私服上面&#xff0c;使用 import project的方式&#xff0c;从旧项目迁移到新地址仓库&#xff0c;但是代码一直没拉过去。所以使用命令的方式&#xff0c;进行代码迁移。 第一步&#xff1a;使用git clone --mirror git地址&#xff0c;进行代码克隆 …

如何让 Llama2、通义千问开源大语言模型快速跑在函数计算上?

作者&#xff1a;寒斜 阿里云智能技术专家 「本文是“在 Serverless 平台上构建 AIGC 应用”系列文章的第一篇文章。」 前言 随着 ChatGPT 以及 Stable Diffusion&#xff0c;Midjourney 这些新生代 AIGC 应用的兴起&#xff0c;围绕 AIGC 应用的相关开发变得越来越广泛&…

【一周安全资讯1007】多项信息安全国家标准10月1日起实施;GitLab发布紧急安全补丁修复高危漏洞

要闻速览 1.以下信息安全国家标准10月1日起实施 2.GitLab发布紧急安全补丁修复高危漏洞 3.主流显卡全中招&#xff01;GPU.zip侧信道攻击可泄漏敏感数据 4.MOVEit漏洞导致美国900所院校学生信息发生大规模泄露 5.法国太空和国防供应商Exail遭黑客攻击&#xff0c;泄露大量敏感…

三模块七电平级联H桥整流器电压平衡控制策略Simulink仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

竞赛选题 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

Linux虚拟机克隆之后使用ip addr无法获取ip地址

Linux虚拟机克隆之后使用ip addr无法获取ip地址 因为克隆得到的虚拟机&#xff0c;与原先的linux系统是一模一样的包括MAC地址和IP地址。需要修改信息。 设置IP地址&#xff1a; 使用vi命令打开linux的网卡 //ifcfg-enth0是虚拟网卡的名称&#xff0c;如果你的不叫这个名字&a…

[数据结构]迷宫问题求解

目录 数据结构——迷宫问题求解&#xff1a;&#xff1a; 1.迷宫问题 2.迷宫最短路径问题 数据结构——迷宫问题求解&#xff1a;&#xff1a; 1.迷宫问题 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #includ…

拼多多API接口的使用方针如下:

了解拼多多API接口 拼多多API接口是拼多多网提供的一种应用程序接口&#xff0c;允许开发者通过程序访问拼多多网站的数据和功能。通过拼多多API接口&#xff0c;开发者可以开发各种应用程序&#xff0c;如店铺管理工具、数据分析工具、购物比价工具等。在本章中&#xff0c;我…

1.6 IntelliJ IDEA开发工具

前言&#xff1a; ### 1.6 IntelliJ IDEA开发工具笔记 - **背景**&#xff1a; - 使用基础文本编辑器如记事本编写Java代码虽然可行&#xff0c;但存在效率低下且难以调试的问题。 - 集成开发环境 (IDE) 可以有效地提高Java程序的开发效率。 - **常见Java IDE**&#xf…

基于springboot实现自习室预订系统的设计与实现项目【项目源码+论文说明】

基于springboot实现自习室预订系统的设计与实现演示 摘要 在网络高速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给学生带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;学院只能以学生为导向&#xff0c;所以自习…