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

news2024/10/7 16:20:52

文章目录

  • 参考
  • 环境
  • 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 文件中的内容

<?php


var_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) "<?php


var_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.coloradmin.cn/o/1065884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件测试】功能测试/接口测试/自动化测试/性能测试/验收测试

软件测试的主要流程 一、测试主要的四个阶段 1.测试计划设计阶段&#xff1a;产品立项之后&#xff0c;进行需求分析&#xff0c;需求评审&#xff0c;业务需求评级&#xff0c;绘制业务流程图。确定测试负责人&#xff0c;开始制定测试计划&#xff1b; 2.测试准备阶段&…

【每日一题】股票价格跨度

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;暴力枚举方法二&#xff1a;单调栈 写在最后 Tag 【单调栈】【设计类】【数组】【2023-10-07】 题目来源 901. 股票价格跨度 题目解读 找出小于等于今天股票价格的最大连续天数&#xff08;从今天往回数&#xff0c;…

AI颠覆法律行业,律师要失业了?

如果要说一个 AI 真正起飞&#xff0c;并且对行业从业者带来的更多是正面影响的垂直行业&#xff0c;小编觉得在目前阶段&#xff0c;法律可以算一个。这个行业有几个特点&#xff1a;对人的依赖很大&#xff0c;专业性很强&#xff0c;大量繁复的文字工作。因此&#xff0c;在…

水土保持方案编制丨点型项目、市政工程、线型工程、矿山工程、水利工程、取土场/弃渣场、补报项目、水土保持监测验收等

目录 专题一 点型水土保持方案编制方法及案例分析 专题二 市政工程水土保持方案编制方法及案例分析 专题三 线型工程水土保持方案编制方法及案例分析 专题四 矿山工程水土保持方案编制方法及案例分析 专题五 水利工程水土保持方案编制方法及案例分析 专题六 取土场、弃渣…

电影产业的数据洞察:爬虫技术在票房分析中的应用

概述 电影产业是一个庞大而复杂的行业&#xff0c;涉及到各种各样的因素&#xff0c;如导演、演员、类型、主题、预算、宣传、口碑、评分、奖项等。这些因素都会影响电影的票房收入&#xff0c;也会反映出电影市场的动态和趋势。为了更好地了解电影产业的数据洞察&#xff0c;…

Python机器学习实战-特征重要性分析方法(6):XGBoost(附源码和实现效果)

实现功能 计算一个特性用于跨所有树拆分数据的次数。更多的分裂意味着更重要。 实现代码 import xgboost as xgb import pandas as pd from sklearn.datasets import load_breast_cancer import matplotlib.pyplot as pltX, y load_breast_cancer(return_X_yTrue) df pd.D…

CMMI5认证哪些企业可以申请

CMMI5认证哪些企业可以申请 什么是CMMI5认证 CMMI&#xff08;Capability Maturity Model Integration&#xff09;是一种用于评估组织的软件工程能力的国际标准。CMMI模型包括5个等级&#xff0c;其中CMMI5是最高等级&#xff0c;代表组织具有达到持续优化和创新的能力。获得…

源码编译dotnetcore的runtime

为了dotnetcore运行时的安可目标&#xff0c;特意在国庆假期研究了怎么编译dotnetcore的runtime。由于我们用的是.net6&#xff0c;最新的是8&#xff0c;所以从github下载的.net6的分支代码进行的编译。查遍了国内外资料&#xff0c;估计微软服务太体贴了&#xff0c;竟然没什…

关于 “高可用集群” 的 从业经验漫谈

关于高可用集群 PART 1 高可用的概念 高可用&#xff08;High Availability&#xff09;是高可用集群&#xff08;High Availability Cluster&#xff09;的简称&#xff0c;至少由2台服务器组成&#xff0c;一般指的是应用服务对客户端的持续可用。高可用集群可以借助多种技术…

SuperMap:开启地理信息的无限可能

文章目录 引言简介SuperMapSuperMap的背景和发展SuperMap的功能特点 SuperMap的应用案例城市规划与管理天气预报与灾害管理物流与运输管理地理信息服务 最佳实践与技巧数据准备与处理地图制作与展示空间分析与决策 展望未来结论 引言 随着现代社会的发展&#xff0c;地理信息系…

CentOS Integration SIG 正式成立

导读CentOS 董事会已批准成立 CentOS Integration Special Interest Group (SIG)。该小组旨在帮助那些在 Red Hat Enterprise Linux (RHEL) 或特别是其上游 CentOS Stream 上构建产品和服务的人员&#xff0c;验证其能否在未来版本中继续运行。 红帽 RHEL CI 工程师 Aleksandr…

性能测试?

目录 一、什么是性能测试 二、系统性能指标 2.1 响应时间 2.2 系统处理能力 2.3 吞吐量 2.4 并发用户数 2.5 错误率 三、资源性能指标 3.1 CPU 3.2 内存 3.3 磁盘吞吐量 3.4 网络吞吐量 四、中间件指标 五、数据库指标 六、稳定性指标 一、什么是性能测试 先看…

PageRank(下):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

为何说医疗器械售后前景呈持续发展趋势?

为何说医疗器械售后前景呈持续发展趋势&#xff1f;如果医院的设备突然不运转了无法工作了&#xff0c;医院如果不及时维修&#xff0c;一天下来不仅患者有生命危险&#xff0c;医院的经济损失也不可估量&#xff0c;但是你知道这些医院的这些设备是怎么维修的吗&#xff1f;医…

淘宝商品数据分析接口,淘宝商品详情数据接口

淘宝商品数据分析接口可以通过淘宝API进行获取。 淘宝API是一种程序接口&#xff0c;通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问淘宝平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现淘宝平台的数据开放。 通过淘宝API提供的…

钡铼BL302与PLC:酿酒业变革的助力

啤酒是人类非常古老的酒精饮料&#xff0c;是水和茶之后世界上消耗量排名第三的饮料。 啤酒在生产过程中主要有制造麦芽、粉碎原料、糖化、发酵、贮酒後熟、过滤、灌装包装等工序流程。需要用到风选机、筛分机、糖化锅、发酵设备、过滤机、灌装机、包装机等食品机械设备。这些食…

假期后寻找好用的电商API接口系列——淘宝API(京东1688拼多多等电商平台)

当闹钟响起&#xff0c;我们不得不从美好的梦境中回到现实&#xff0c;开始新的一天。尽管心中还留有假期的余味&#xff0c;我们依然要面对工作、学习和生活的压力。 电商平台API接口是指电商平台提供的一系列应用程序接口&#xff0c;用于允许开发者或商家与电商平台进行数据…

c++ qt--线程(二)(第九部分)

c qt–线程&#xff08;二&#xff09;&#xff08;第九部分&#xff09; 一.线程并发 1.并发问题&#xff1a; ​ 多个线程同时操作同一个资源&#xff08;内存空间、文件句柄、网络句柄&#xff09;&#xff0c;可能会导致结果不一致的问题。发生的前提条件一定是多线程下…

实现动态表单的一种思路 | 京东云技术团队

一、动态表单是什么 区别于传统表单前后端配合联调的开发实现方式&#xff0c;动态表单通过一种基于元数据管理的配置化方法来实现表单的动态生成&#xff0c;并能根据配置自由增改删指定字段。实现特定需求的自助化。 图1.1 传统表单前后台协作模式 图1.2 动态表单前后台协作…