CTF实战解析:文件上传漏洞攻防与WebShell防御策略
1. 项目概述从两道CTF题看文件上传漏洞的攻防实战最近在复盘一些经典的CTFCapture The Flag题目发现文件上传这个老生常谈的漏洞点依然是Web安全攻防中的核心战场。特别是“[极客大挑战 2019]Upload1”和“[ACTF2020新生赛]Upload1”这两道题虽然都叫Upload1但考察的侧重点和绕过技巧截然不同非常值得拿出来细细拆解。对于刚入门安全的新手或者想巩固文件上传漏洞知识的朋友来说这两道题就像两个精心设计的“靶场”能让你在实战中理解黑名单过滤、MIME类型检查、文件内容校验等常见防御手段的弱点在哪里。简单来说文件上传漏洞的本质是攻击者能够将恶意文件比如WebShell上传到服务器可执行目录从而获取服务器控制权。这两道题模拟了真实环境中开发者可能犯的几种错误。通过手动尝试绕过这些限制你能深刻体会到“安全是层层设防”的含义以及为什么一个疏忽就可能导致全线崩溃。接下来我会带你一步步复盘解题过程并从中提炼出文件上传漏洞的通用审计思路和防御建议这些经验对你审计真实项目中的上传功能会有直接帮助。2. 漏洞原理与常见防御手段拆解在动手解题之前我们必须先搞清楚一个健壮的文件上传功能应该有哪些防御措施而攻击者又会从哪些角度去寻找突破口。这就像一场攻防博弈知己知彼才能百战不殆。2.1 文件上传漏洞的核心风险文件上传功能如果设计不当最直接的风险就是WebShell上传。攻击者上传一个用脚本语言如PHP、JSP、ASP编写的恶意文件到服务器。一旦这个文件被放置在Web目录下并能通过URL访问攻击者就可以在浏览器中执行任意系统命令相当于拿到了服务器的一扇“后门”。例如一个经典的PHP一句话WebShell是这样的?php eval($_POST[‘cmd’]);?。攻击者通过POST请求向这个文件发送命令参数服务器就会执行相应的命令。2.2 开发者常用的防御策略及其弱点为了阻止恶意文件上传开发者通常会部署多层检查但每层都可能存在绕过方法客户端校验最弱通常指使用JavaScript在浏览器端检查文件扩展名或大小。这是最容易被绕过的因为攻击者可以禁用浏览器JS或者直接使用Burp Suite等工具拦截并修改HTTP请求使检查完全失效。在实际安全测试中我们基本不把这种校验当作有效防护。服务端扩展名检查黑名单/白名单黑名单禁止上传如.php,.jsp,.asp等危险扩展名。问题在于名单可能不全。绕过方法包括使用其他可执行扩展名如.php5,.phtml,.phps(在某些服务器配置下可被解析为PHP)。利用操作系统特性如Windows下test.php.(末尾有点) 或test.php::$DATA在存储时可能会被去掉特殊部分但Apache在解析时可能仍将其视为.php。大小写混淆如.Php,.PHP。白名单只允许上传如.jpg,.png,.gif等安全扩展名。这是比黑名单更安全的方式但并非无懈可击。如果校验逻辑存在缺陷例如先检查扩展名再重命名文件时逻辑错误仍可能被利用。或者结合其他漏洞如解析漏洞一起利用。MIME类型检查检查HTTP请求头中的Content-Type字段例如要求图片必须是image/jpeg或image/png。绕过方法极其简单用代理工具如Burp Suite将请求中的Content-Type直接修改为允许的类型即可。这只是一个“信任客户端”的检查非常不可靠。文件内容检查这是更高级的防御通常有两种文件头检查通过读取文件最前面的几个字节魔数来判断真实类型。例如JPEG文件头是FF D8 FF E0PNG是89 50 4E 47。要绕过攻击者需要制作一个包含正确文件头的恶意文件例如在GIF89a;或PNG文件头之后再插入PHP代码。这通常需要结合文件包含漏洞或服务器解析漏洞才能让代码被执行。二次渲染这是最有效的防御手段之一。服务器对上传的图片进行真正的图像处理如缩放、裁剪、重新压缩然后保存处理后的新图片。任何嵌入在元数据或像素数据之外的恶意代码都会在渲染过程中被清除。绕过二次渲染的难度极高通常需要深入研究图像处理算法的缺陷在保持图片视觉不变的前提下精心构造能“幸存”的恶意数据这属于高级技巧。重命名与目录隔离即使文件上传了通过将其重命名为随机字符串如UUID或存放在不可通过Web直接访问的目录也能极大降低风险。攻击者即使上传成功也可能因为不知道文件名或访问路径而无法利用。理解了这些我们再回头看那两道CTF题就能明白它们各自在考察哪一层的防御与突破了。3. “[极客大挑战 2019]Upload1” 解题全流程与黑名单绕过这道题是一个典型的黑名单过滤场景附带了一些简单的迷惑项。我们按照实战渗透测试的流程来走一遍。3.1 环境探测与界面分析首先访问题目地址你会看到一个简单的文件上传表单。作为测试的第一步我习惯先上传一个正常的图片文件比如test.jpg看看服务器的正常反应是什么。上传后可能会返回文件路径这能帮助我们了解服务器的存储目录和命名规则。同时用浏览器开发者工具或Burp Suite查看上传请求的格式确认是否有额外的参数或自定义头部。注意在真实测试和CTF中先用正常文件“投石问路”是非常重要的。这能帮你建立基线行为避免一开始就触发过于严格的防御机制而被封IP。3.2 初试绕过扩展名与MIME类型接下来尝试上传一个最简单的PHP WebShell文件shell.php。不出意外页面会返回错误提示“不允许上传该类型文件”。这说明服务端有校验。第一步尝试修改Content-Type。用Burp Suite拦截上传shell.php的请求将其中的Content-Type: application/octet-stream修改为Content-Type: image/jpeg然后转发。如果题目只做了MIME类型检查这一步就能成功。但在这道题里你会发现依然失败说明它至少还检查了文件扩展名。第二步尝试黑名单绕过。既然直接传.php不行我们就试试其他可能被解析为PHP的扩展名。我按照常见绕过列表逐一尝试.php3,.php4,.php5,.phtml这些是历史遗留或特定配置下的PHP扩展名。.Php,.PHP大小写绕过。.php.(末尾加点),.php(末尾加空格)利用Windows系统文件名处理特性。在尝试.phtml时我发现上传成功了服务器返回了文件访问路径。这说明题目的黑名单里可能只包含了.php漏掉了.phtml。.phtml文件在某些Apache服务器配置中如果AddType指令包含了它会被当作PHP文件来解析。3.3 利用WebShell获取Flag上传成功后我们得到了一个类似http://target.com/upload/shell.phtml的地址。访问这个地址会显示我们上传的WebShell内容如果是一句话木马可能是一片空白或报错这取决于代码是否被正确解析。接下来使用中国菜刀、蚁剑这类WebShell管理工具或者直接用curl命令来连接。假设我们上传的WebShell是?php eval($_POST[‘cmd’]);?那么我们可以用curl发送POST请求来执行命令curl -X POST http://target.com/upload/shell.phtml -d “cmdsystem(‘ls -la /’);”这条命令会尝试列出服务器根目录的文件。在CTF环境中Flag文件通常放在Web根目录、/根目录或者/flag、/home/ctf/flag.txt等常见位置。通过执行find / -name ‘*flag*’ 2/dev/null或cat /flag等命令就能找到并读取Flag内容。实操心得这道题的关键在于对黑名单的全面测试。很多开发者的黑名单只来源于网上搜到的“常见危险扩展名列表”而这种列表往往更新不及时或不完整。作为测试人员手里需要有一份自己维护的、针对不同语言和环境的潜在可执行扩展名清单。4. “[ACTF2020新生赛]Upload1” 解题全流程与文件头绕过这道题的难度比上一道略有提升它引入了文件头检查但同时也留下了一个关键的“后门”——前端提示。4.1 关键信息收集从前端代码入手打开题目页面同样是一个上传表单。但仔细观察页面源码右键查看源代码你会发现惊喜。在HTML注释或者某个JavaScript变量里很可能藏着类似这样的提示“!-- 只能上传jpg/png/gif哦 --” 或者 “checkFile() { if(!/\.(jpg|png|gif)$/i.test(...)) }”。这个信息至关重要它明确告诉我们服务器端或至少前端期望的白名单是.jpg,.png,.gif。这比黑名单的范围更明确我们的绕过思路也需要调整我们必须让文件同时满足扩展名是白名单内的并且文件内容文件头也符合图片格式。4.2 制作“图片马”绕过双重检查我们的目标是上传一个既能通过.jpg扩展名和文件头检查又能包含PHP代码的文件。这就是常说的“图片马”。制作方法有很多这里介绍两种最常用的使用copy命令Windowscopy /b normal.jpg shell.php webshell.jpg这条命令将normal.jpg一张正常的图片和shell.php你的PHP WebShell代码文件以二进制方式合并生成一个新文件webshell.jpg。新文件的开头是normal.jpg的完整二进制数据包含正确的JPEG文件头末尾追加了shell.php的代码。当服务器检查文件头时看到的是合法的JPEG头但当我们通过Web访问这个.jpg文件时如果服务器配置不当例如把它当作PHP解析那么末尾的PHP代码就可能被执行。使用文本编辑器Linux/macOS/通用 用vim或nano打开一张正常的normal.jpg在文件的最末尾切记是末尾不是开头或中间否则会破坏图片结构导致文件头检查失败新起一行写入你的PHP代码例如?php phpinfo(); ?。然后保存。重要警告在文件开头或中间插入代码极大概率会导致图片损坏无法通过文件头校验。一定要追加到末尾。4.3 上传与利用解析漏洞的猜测制作好webshell.jpg后我们进行上传。由于扩展名是.jpg文件头也是合法的图片格式因此应该能顺利通过检查上传成功。但问题来了即使上传成功服务器也会把它当作静态图片来处理不会执行其中的PHP代码。这时我们就需要利用另一个常见的漏洞——文件包含漏洞或服务器解析漏洞。文件包含漏洞如果网站其他地方存在本地文件包含LFI漏洞比如有一个参数?filewebshell.jpg那么服务器在包含这个文件时就会将其中的PHP代码当作代码来执行。但在这道纯上传题中通常不会直接给出文件包含点。服务器解析漏洞这是本题更可能的考察点。历史上一些Web服务器存在特定的解析漏洞。例如IIS 5.x/6.0的目录路径解析漏洞如果文件路径像/upload/webshell.jpg/xxx.phpIIS 6.0 会错误地将webshell.jpg解析为PHP文件。更常见的是Apache 的解析漏洞Apache 在解析文件时是从右向左读取扩展名直到遇到一个它认识的扩展名。如果服务器配置了AddHandler php5-script .php但没处理好多重扩展名那么webshell.jpg.php可能会被解析。但更经典的一个漏洞是如果Apache的mod_mime模块配置不当webshell.php.jpg也有可能被解析为PHP文件因为Apache看到了最后的.php。在这道ACTF新生赛的题目中经过测试我发现上传webshell.jpg后直接访问这个.jpg链接PHP代码并没有执行。但是如果我尝试访问webshell.jpg.php即使这个文件不存在或者服务器在处理请求时存在某种缺陷可能会导致代码执行。实际上这道题的一个常见解法是利用某些环境下对文件名中%00空字节截断的处理但PHP高版本已修复或者更简单地题目环境可能故意配置了一个有缺陷的Apache使得.jpg文件在某些情况下被错误地交给PHP解析器。更通用的思路是当白名单文件头检查都通过后你需要思考“如何让服务器以脚本方式处理这个图片文件”。这可能涉及到对题目环境更深入的探测或者结合其他漏洞。对于这道题一种可能的简单答案是题目环境本身配置了一个脆弱的解析规则使得*.jpg文件如果包含PHP标签就会被解析。你需要做的就是不断尝试访问上传的图片马或者用工具扫描可能的解析异常路径。排查技巧实录遇到这种情况我会使用 Burp Suite 的 Intruder 模块对上传后的文件路径进行模糊测试。例如假设上传后的文件路径是/uploads/abc123.jpg我会用 Intruder 对扩展名部分进行爆破尝试访问/uploads/abc123.jpg.php,/uploads/abc123.jpg.phtml,/uploads/abc123.jpg/.php等各种变体观察服务器返回的状态码和内容寻找可能触发解析异常的路径。5. 文件上传漏洞的深度防御与安全开发建议通过这两道题我们看到了从弱到强的几种防御手段及其绕过方式。那么在真实的项目开发中我们应该如何构建一个难以攻破的文件上传功能呢以下是我总结的“纵深防御”方案5.1 设计阶段的安全原则白名单优于黑名单这是铁律。只允许业务必需的文件类型例如用户头像只允许jpg, png, gif。白名单应该在服务端用正则表达式严格匹配文件扩展名。前端校验只为体验后端校验才是关键前端可以做初步的类型、大小检查来提升用户体验但绝不能作为安全依据。所有安全校验必须在服务端进行。最小权限原则上传目录应设置为不可执行。在Linux下使用chmod -R 755 uploads/确保目录可读可进入但文件默认不可执行。更好的做法是将上传目录设置为Web根目录之外然后通过后端程序如PHP的readfile()来代理访问静态文件这样用户就无法直接请求上传目录下的任何脚本。5.2 服务端校验的“组合拳”扩展名校验白名单使用严格的正则表达式并转换为小写后检查。例如if(!preg_match(‘/^.*\.(jpg|png|gif)$/i’, $filename)) { die(‘Invalid file type’); }。MIME类型校验虽然可绕过但可以作为一层辅助检查。应结合文件头检查一起使用。文件头校验魔数检查这是识别文件真实类型最可靠的方法之一。读取文件的前几个字节进行判断。$file_header bin2hex(file_get_contents($_FILES[‘file’][‘tmp_name’], false, null, 0, 4)); $allowed_types [‘ffd8ffe0’ ‘jpg’, ‘89504e47’ ‘png’, ‘47494638’ ‘gif’]; if(!isset($allowed_types[$file_header])) { die(‘Invalid file content’); }二次渲染对于图片文件这是终极武器。使用GD库PHP或PIL库Python等重新生成图片。任何附着在图片上的额外数据都会被丢弃。$src_img imagecreatefromjpeg($_FILES[‘file’][‘tmp_name’]); $dst_img imagecreatetruecolor(imagesx($src_img), imagesy($src_img)); // … 进行缩放或复制操作 … imagejpeg($dst_img, $final_save_path, 90); // 保存新渲染的图片 imagedestroy($src_img); imagedestroy($dst_img);重命名与目录分离重命名使用随机字符串如md5(uniqid().mt_rand())重命名文件避免用户猜测文件名。同时不要保留原始扩展名或者可以添加一个自定义的后缀。目录分离根据日期或用户ID生成子目录存放文件避免单个目录文件过多。上传目录的路径不应由用户控制。5.3 运维与配置层面的加固Web服务器配置Apache确保上传目录的Directory配置中没有SetHandler或AddHandler等将特定目录设置为可执行脚本的指令。可以为上传目录单独配置一个禁止执行脚本的规则Directory “/var/www/html/uploads” php_flag engine off Options -ExecCGI /DirectoryNginx在 location 块中使用if语句或location匹配规则禁止访问带特定扩展名的文件或者直接关闭该目录下PHP文件的解析。location ~* ^/uploads/.*\.(php|php5|phtml)$ { deny all; }文件系统监控使用HIDS主机入侵检测系统监控Web目录下是否有新的可执行脚本文件被创建。定期安全扫描对上传目录进行定期的静态恶意代码扫描。文件上传功能就像系统的一个“输入口”必须设立重重关卡。从这两道CTF题延伸到真实开发我的体会是安全没有银弹必须依靠“白名单文件头检查二次渲染重命名权限控制”这套组合拳才能将风险降到最低。每次代码评审时看到文件上传功能我都会下意识地在心里过一遍这个检查清单这已经成了一种职业习惯。

相关新闻

AI Agent最小权限控制实战:OpenClaw安全锁设计与实现

AI Agent最小权限控制实战:OpenClaw安全锁设计与实现

1. 项目概述:为什么AI Agent需要“安全锁”?最近在折腾各种AI Agent项目,从自动化客服到数据分析机器人,发现一个越来越棘手的问题:这些Agent的能力越强,闯祸的潜力也越大。想象一下,你给一个Ag…

2026/8/5 5:19:16 阅读更多 →
MFC模态与非模态对话框:从消息循环到实战选择的完整指南

MFC模态与非模态对话框:从消息循环到实战选择的完整指南

1. 项目概述:从“弹窗”到“流程控制”的本质理解在Windows桌面应用开发,尤其是使用MFC(Microsoft Foundation Classes)框架时,对话框是用户交互的核心组件。很多刚接触MFC的朋友,在创建第一个对话框程序后…

2026/8/5 5:19:16 阅读更多 →
STM32单片机系统仿真:Proteus环境下的状态监测项目实践

STM32单片机系统仿真:Proteus环境下的状态监测项目实践

1. 先搞清楚这个仿真项目到底要解决什么问题如果你正在做单片机课程设计、毕业设计,或者想找一个能跑起来的STM32综合项目来练手,这个“基于STM32单片机观光车状态监测系统Proteus仿真设计”是个很典型的切入点。它不是一个纯软件算法,也不是…

2026/8/5 5:18:15 阅读更多 →

最新新闻

Logue:本地AI会议纪要工具,Mac上实现隐私安全的Markdown笔记生成

Logue:本地AI会议纪要工具,Mac上实现隐私安全的Markdown笔记生成

这次我们来看一个专门解决会议记录痛点的本地 AI 工具:Logue 1.0.1。它不是又一个云端 AI 笔记应用,而是直接把 AI 会议纪要能力搬到了你的 Mac 上,核心是本地运行、隐私安全、输出纯 Markdown。对于经常开线上会议、又担心录音数据上传云端有…

2026/8/5 17:08:52 阅读更多 →
【Math】Vector Rotation

【Math】Vector Rotation

已知向量 OP0→\overrightarrow{OP_0}OP0​​ 为 (x0,y0)(x_0,y_0)(x0​,y0​),求旋转 ϕ\phiϕ 度后的坐标 (x1,y1)(x_1,y_1)(x1​,y1​)由上图可知 x1∣OP1→∣cos(θϕ)∣OP0→∣cos(θϕ)∣OP0→∣cosθ⋅cosϕ−∣OP0→∣sinθ⋅sinϕx0cosϕ−y0sinϕ\begin{a…

2026/8/5 17:08:51 阅读更多 →
本地AI创意项目部署实践:从环境配置到API集成全流程指南

本地AI创意项目部署实践:从环境配置到API集成全流程指南

这次我们来看一个名为“TeeTeePor”的项目。从名称和网络搜索材料来看,这是一个与“小狗补充Pip能量”相关的趣味性项目。虽然具体的功能细节在现有材料中不够明确,但这类项目通常涉及图像生成、视频处理或某种形式的数字内容创作,旨在通过技…

2026/8/5 17:08:51 阅读更多 →
STM32驱动WS2812B灯带:SPI/PWM/DMA方案详解与避坑指南

STM32驱动WS2812B灯带:SPI/PWM/DMA方案详解与避坑指南

1. 从“点灯”到“调色”:WS2812B驱动进阶的核心挑战 上一篇文章我们聊了怎么用STM32最基本的GPIO翻转去“点亮”一颗WS2812B-2020灯珠,算是成功迈出了第一步。但玩过这类可编程灯带的朋友都知道,点亮只是开始,真正的乐趣在于“控…

2026/8/5 17:08:51 阅读更多 →
Appium自动化实战:绕过加密抓取抖音粉丝数据

Appium自动化实战:绕过加密抓取抖音粉丝数据

1. 项目缘起与核心挑战 最近在做一个关于社交媒体用户画像分析的小项目,需要获取一批抖音用户的粉丝数据。一开始,我理所当然地想到了传统的网络爬虫,用Python的 requests 库去模拟请求。但实际操作下来,发现抖音的防护措施比想…

2026/8/5 17:08:51 阅读更多 →
【服装一致性黄金阈值】:基于12,846组真实电商图测试,曝光SD v2.1/v3.0/v3.5在Pose-Refine模式下的3.8mm像素偏移临界点

【服装一致性黄金阈值】:基于12,846组真实电商图测试,曝光SD v2.1/v3.0/v3.5在Pose-Refine模式下的3.8mm像素偏移临界点

更多请点击: https://intelliparadigm.com 第一章:【服装一致性黄金阈值】核心发现与行业意义 在多模态视觉识别与时尚产业数字化实践中,我们通过大规模服饰图像聚类实验(覆盖12.7万张标注样本、38个主流品牌、96种基础品类&…

2026/8/5 17:07:51 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →