news 2026/10/22 6:10:02

PHP图片木马原理与防御:从DVWA靶机实战到文件上传漏洞加固

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP图片木马原理与防御:从DVWA靶机实战到文件上传漏洞加固

PHP图片木马这事儿,我前阵子在一台自建的DVWA靶机上完整复盘过一遍。从构造一个带漏洞的上传点,到用图片伪装PHP代码落地执行,再到把Web目录翻了个底朝天,整个过程走下来,最大的感触是:最危险的攻击往往不需要多高深的技术,而是建立在开发者的“想当然”之上。很多文章喜欢直接扔出一段图片马代码让你复现,但从来不说为什么这样能绕过、被绕过之后该怎么办。这篇我就基于自己的实操记录,掰开揉碎讲讲图片木马的原理、检测思路,以及DVWA这类靶机环境对防御者到底有多大价值。

先说人话定义:所谓PHP图片木马,就是把PHP代码藏进一张看似正常的图片文件里,让服务器在解析时把图片当PHP脚本执行。攻击者利用的是 Web 应用对“文件类型”的信任——前端校验了Content-Type,后端校验了扩展名,但没人真正去看文件内容是什么。我在靶机上测试过几种常见组合,比如直接在GIF文件末尾追加PHP代码,或者用exif_imagetype()函数只验证头部却没管文件主体,这些都能让图片马“合法”落地。

这篇文章不是教你去做坏事,而是从一个蓝队视角出发,把攻击链路拆开——目的是让你知道文件上传漏洞为什么防不住、检测脚本为什么形同虚设、以及遇到图片马之后怎么清理、怎么加固。整个实操都在本地DVWA靶机环境完成,全程可控、可复现,适合刚入门Web安全的人,也适合写后端接口的程序员自查自己的上传逻辑。

1. 图片木马的核心原理与常见伪装方式

1.1 为什么一段PHP代码能藏进图片

图片文件本质上就是一个字节序列。PNG的头部固定是\x89PNG\r\n\x1a\n,GIF的头部是GIF89a,但这些校验逻辑只检查开头几个字节,文件后面拼接什么内容,很多校验工具根本不管。攻击者就把<?php @eval($_POST['cmd']);?>这样的代码直接追加到图片尾部,图片在浏览器里正常显示,但一旦被当作PHP执行,恶意代码就激活了。

我在靶机上测试过几种拼接方式,差异很大:

  • 直接在图片末尾追加文本形式的PHP代码,文件数据量小,但代码是明文,容易被简单关键字扫描查出来。
  • 借助工具将PHP代码隐藏在图片的EXIF注释、GIF注释块里,隐蔽性稍好,但需要解析器能读出这些字段。
  • 利用文件包含漏洞(LFI/RFI)间接执行,图片马本身不需要可执行,只要后续能传入include函数。

这里要说明一点,图片马能否真正“激活”,取决于服务器环境的配合。最常见的情况是Apache配置了AddHandler php7-script .php或类似指令,导致带有PHP扩展名的文件被直接交给PHP解释器,攻击者就把图片马改名为shell.php或x.php。另一种是Nginx配合PHP-FPM时,如果cgi.fix_pathinfo开启,访问/uploads/shell.jpg/xxx.php也可能触发PHP执行。这也是为什么很多防御方案都强制“上传目录不执行脚本”。

1.2 文件校验的几个盲区

我见过很多上传系统做了校验,但仍然被图片马绕过的例子。拆解来看,问题出在这些地方:

第一,只验Content-Type。前端上传时浏览器会把文件的MIME类型发给服务端,比如image/jpeg,后端如果直接用这个值判断是否放行,攻击者随意抓包改一下就能骗过去,实际上文件内容是PHP代码。

第二,只验文件头(magic number)。这也是我最初踩的坑——校验函数读文件前几字节,判断是不是JFIF或PNG,就认为安全。但PHP代码在文件尾部,头部校验通过不代表整文件安全。用fileinfo扩展(finfo_open)获取的是MIME类型,同样只读头部特征。

第三,扩展名与文件内容分离。系统只允许.jpg后缀,但攻击者把代码写到.jpg文件的尾部,然后利用其他漏洞(比如文件包含)来执行它。这种场景下,上传点本身防御很严,问题出在别的地方被串联利用了。

第四,文件名处理不当。有些系统直接把用户输入的文件名拼进保存路径,shell.php.jpg这种多重后缀在特定服务器配置下也会被解析,Windows服务器还会自动过滤掉后面的点,导致shell.php.变成shell.php。

我在靶机上观察到,纯fileinfo或getimagesize校验根本挡不住拼接型图片马,因为源图片是真实的,图片信息完全合法,只是尾部被塞了东西。

1.3 图片马在DVWA靶机上的典型利用链路

以DVWA的上传模块为例,安全等级从low到high差异明显。我分别测试过这三档,方便对照理解:

  • Low等级:只校验MIME类型,抓包把Content-Type改成image/jpeg,上传名为shell.php.jpg或直接shell.php,再用菜刀、蚁剑连接即可。
  • Medium等级:校验了Content-Type和文件头(getimagesize),但没有检查文件内容。测试中,我用一张合法的GIF图片,在尾部追加PHP代码,保存为.php后缀,上传后直接访问可执行。
  • High等级:加了getimagesize()和扩展名白名单,图片马基本无法以PHP后缀直接落地。但如果是高版本DVWA配合其他漏洞(如文件包含),High也不是绝对安全。

这个实验最大的价值在于,你可以在自己电脑上用一套标准靶机复现真实的攻击路径,从而理解上传校验的薄弱环节在哪。

2. DVWA靶机环境:给防御者一套合法演练场

2.1 为什么本地靶机比真实网站更适合研究

很多刚入门的人喜欢拿别人的网站练手,这既不合规也容易惹祸。DVWA这类靶机存在的意义就是提供一个与生产环境近似、但完全可控的演练场。你可以放心使用各种攻击手法,把系统打挂了大不了重启恢复,所有操作都在本地完成,不产生任何法律风险。

我在使用DVWA时最看重的几个点:

  • 模块覆盖全面:SQL注入、XSS、文件上传、命令注入、CSRF基本都有,适合对照学习攻击与防御的对应关系。
  • 安全等级可调:low、medium、high三档,让你直观感受同一漏洞在不同防御强度下的表现。
  • 源码可读:每关都有源码展示,能直接对比审计,这对理解底层逻辑帮助极大。
  • 可快速恢复:上传了图片马、改了文件权限,重启容器或覆盖目录就能复原。

2.2 靶机搭建过程中的一点心得

DVWA官方推荐用PHP内置服务跑,但我实测直接php -S 127.0.0.1:8080有时会因为PHP版本差异出现报错,更稳妥的方案是组合Nginx或Apache加PHP-FPM。如果你用Docker,社区有现成的镜像,拉下来直接起容器,映射端口就能访问,省去配置数据库的时间。

我当前用的方案是:Ubuntu虚拟机内装Apache2 + PHP 7.4 + MariaDB,DVWA放在/var/www/html下。首次访问会检查依赖,按提示把config/config.inc.php.dist复制为.inc.php并填好数据库账户密码即可。这里有个小细节:如果你用的是PHP 8以上的版本,部分旧版DVWA会报函数弃用错误,建议直接拉最新release,或者把error_reporting调低一些。

靶机跑起来后不要急着进入闯关模式。我每次都会先把dvwaSecurity等级切到 medium 甚至 high 跑一遍,观察它什么行为会被拦截,什么行为能绕过——这种“带着问题去测试”的方式,比单纯从低等级直接打穿要更有收获。因为你最终要面对的真实系统,不会像low等级那么配合。

2.3 靶机使用边界:什么能碰,什么不能碰

必须强调一条红线:DVWA可以随便打,但未经授权的目标系统,任何形式的探测和攻击都是违法的。即使是学习目的,把实验环境搭建在自己的虚拟机或云主机上,并且不对外提供服务,这都是安全的。如果你想参与真实的授权渗透测试,必须有明确的书面授权,最好有合同约束测试范围和测试时间。

我自己在分享相关实验时,也尽量只讲原理、检测和防御,不会详细贴出可在真实生产环境直接使用的绕过代码。因为同样的技术,在靶机上验证和在真实网站上利用完全是两种性质。你可以在DVWA里把图片马玩出花,但到了真实业务系统,任何一行未授权的payload都可能造成不可挽回的后果。

3. 图片马的检测方法与实操要点

3.1 从文件头到文件尾:手动检测的完整步骤

收到一个图片文件,怎么判断它是不是混入了PHP代码?我一般按以下流程查:

第一步,用十六进制编辑器(010 Editor、HxD都行)打开文件,先看头部字节,确认真实的文件类型。如果声明是JPEG但头部却是GIF89a,立即定位异常。

第二步,跳到文件末尾,检查最后几百字节。图片马的恶意代码通常追加在尾部,因为不影响图片正常显示。直接搜文本<?php、<?、eval、assert、system、$_POST、$_GET这些特征。我测试过,普通的文本搜索就能发现90%以上的低级图片马。

第三步,用命令行工具验证。Linux下直接file image.jpg和exiftool image.jpg,如果输出中出现PHP script或PHP标签,那就是有问题了。Windows下可以用strings命令或findstr搜索二进制内容。

第四步,判读文件大小。一张正常的JPG图片通常几十KB到几百KB,如果看着正常的缩略图大小却有1MB以上,就要留意了。

下面是一段我经常用的Python检测脚本,适合批量扫描上传目录:

import os import re TARGET_DIR = "./uploads" SUSPICIOUS_PATTERNS = [ rb"<\?php", rb"<\?=", rb"eval\s*\(", rb"assert\s*\(", rb"system\s*\(", rb"\$_POST", rb"\$_GET", rb"\$_REQUEST", rb"shell_exec", rb"base64_decode\s*\(", ] def scan_file(filepath): with open(filepath, "rb") as f: content = f.read() for pattern in SUSPICIOUS_PATTERNS: if re.search(pattern, content): return True return False if __name__ == "__main__": for root, _, files in os.walk(TARGET_DIR): for name in files: full_path = os.path.join(root, name) if scan_file(full_path): print(f"[!] Suspicious: {full_path}")

这个脚本简单粗暴,但作为第一道防线足够了。真正高明的隐蔽攻击会用编码或压缩等方式隐藏特征码,所以还需要配合后面的动态检测和日志审计。

3.2 动态检测:部署WAF与中间件层防护

静态扫描只能防住已知特征。如果要检测未知变种,就要在Web层面对上传请求和文件访问行为做动态审计。

我在靶机上测试过ModSecurity搭配OWASP核心规则集(CRS),针对上传接口加了一条自定义规则,用SecRule FILES_TMPNAMES在上传环节检查文件内容是否包含PHP标签,效果比单纯靠应用层校验好很多。WAF层面常用的检测点包括:

  • 上传请求体内容检查,过滤<?php、<%、<script等代码特征。
  • 响应头检查,如果上传目录下任何脚本文件被执行,会返回PHP生成的动态内容,可以通过访问日志的响应码和内容长度比对判断。
  • 访问行为异常,比如正常图片文件频繁被请求,但响应内容长度与真实文件大小不一致,这可能是图片马被执行后输出了额外内容。

中间件配合方面,Nginx可以在location块中关闭上传目录的PHP解析,比如:

location ~* ^/uploads/.*\.(jpg|jpeg|png|gif)$ { expires 30d; add_header Cache-Control "public, no-transform"; }

但这个配置只拦截对图片的直接执行,如果应用内还有文件包含漏洞,攻击者依然可以通过include包含这个图片文件来触发里面的PHP代码。所以中间件防护和代码层加固必须同时做。

3.3 上传目录下的定时巡检与日志审计

攻击者上传图片马之后,通常会立即访问触发执行,然后在Web目录里再写一个更隐蔽的webshell。所以日志审计是发现后续动作的关键。我在靶机上把Apache的访问日志开启到详细级别,然后上传图片马、触发执行,观察日志中的访问序列:

  • 第一次访问上传文件的URL(触发执行)。
  • 紧接着访问某个新生成的PHP文件(攻击者留下的后门)。
  • 可能伴随大量POST请求,这是webshell在做命令交互。

利用日志做异常检测时有个小技巧:统计同一IP访问/uploads/目录下非图片文件的次数。正常业务很少直接访问上传目录里的PHP文件,一旦出现,基本就是有问题的。我把这个思路写成了一段简单的shell命令,定期扫描:

awk '{print $7}' /var/log/apache2/access.log | grep "/uploads/" | grep "\.php" | sort | uniq -c | sort -rn | head -20

这条命令会列出/uploads/下被访问的PHP文件及其次数,Top 10里出现意外文件就值得深入调查。生产环境建议配合日志平台做实时告警,而不只是事后巡检。

4. 防御加固与上传漏洞修复

4.1 最基础但最有效的三板斧

我在复盘过程中发现,绝大部分图片马攻击都能被三个简单的策略挡住,很多系统没被攻破纯粹是因为攻击者没试。

第一,扩展名白名单。只允许.jpg、.jpeg、.png、.gif这类明确的无害后缀,其他一律拒绝。注意,黑名单方案(禁止.php、.asp等)是不可靠的,因为攻击者总能找到你没禁掉的可执行后缀,比如.phtml、.php5、.shtml。

第二,Content-Type强校验。后端要用专业的MIME检测库判断文件真实类型,而不是信任前端传的Content-Type。PHP建议用finfo_file(),Java可以用Tika或Files.probeContentType(),并且在服务端强制重新生成图片(二次渲染),把不安全的附加数据直接丢弃。

第三,重命名文件。上传成功后不保留原始文件名,用随机字符串或时间戳加扩展名组成新文件名。这一步能有效切断一些利用文件名解析逻辑的攻击方式,但注意它解决不了扩展名与内容不匹配的问题。

我是这样组合用的:前端只做交互优化,后端先做getimagesize()验证确为图片,再用finfo确认MIME类型,然后用随机名保存,扩展名统一转为.jpg,最后把文件存到Web目录之外的固定目录,通过专用下载接口输出。这样即使图片尾部带了恶意代码,它也无法直接以PHP扩展名被解析。

4.2 文件内容双重校验与二次渲染

双校验的意思是,除了验证文件头和MIME类型,还要扫描文件内容里的PHP标签、可执行代码特征。前面提到的Python脚本就是一个基础版。对于资源较为充足的项目,更推荐直接用现成的安全SDK或云厂商的对象存储内容检测能力,上传时自动做病毒扫描和Webshell检测。

二次渲染是另一条路线:不要直接保存用户上传的图片,而是用图像处理库(如PHP的GD库、Imagick)重新生成一份图片。这样图片会完全丢失EXIF信息、注释字段、尾部追加的数据,只保留纯粹的图像像素数据。我在靶机上实测过,经过GD库imagecreatetruecolor+imagecopyresampled重采样后,原先追加的PHP代码会直接消失。副作用是图片质量会略有下降,但对绝大多数业务场景可接受。

这里有三个注意点:

  • 二次渲染要确保目标格式一致,比如JPEG图片要保留image/jpeg的MIME和.jpg扩展名。
  • Imagick处理畸形图片时可能触发已知漏洞,注意升级版本。
  • 动图GIF的处理要小心,二次渲染可能破坏动画效果,需要单独评估是否适合。

4.3 目录权限与执行权限控制

文件上传目录应该是整个Web应用里最“安静”的目录,它只需要被读取,不需要被解析执行。我强烈建议用Nginx或Apache显式关闭上传目录的PHP执行权限。

Apache下可以在上传目录的.htaccess中加入:

<FilesMatch "\.(?i:php|phtml|php5|php7|shtml|cgi)$"> Require all denied </FilesMatch>

Nginx下在对应的location块中配置:

location ~* ^/uploads/.*\.(php|phtml|php5)$ { deny all; return 403; }

如果条件允许,把上传文件放到Web根目录之外是更彻底的做法。比如网站根在/var/www/html,上传文件存到/var/www/uploads,用户访问时通过PHP写一个readfile()接口读取并输出文件内容。这样即使文件里藏了代码,也没办法走到Web执行环境。这类方案在实现时注意控制访问权限,避免被用作任意文件下载漏洞(路径穿越)。

4.4 从DVWA的High等级学到的代码审计思路

DVWA的High等级上传模块是怎么实现防御的?我把源码简化一下来看:

if (isset($_POST['Upload'])) { $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename($_FILES['uploaded']['name']); if (!in_array(pathinfo($target_path, PATHINFO_EXTENSION), ['jpg', 'jpeg', 'png'])) { // 扩展名白名单 echo "Only .jpg, .jpeg, .png are allowed."; exit; } $check = getimagesize($_FILES["uploaded"]["tmp_name"]); if ($check === false) { echo "File is not an image."; exit; } // 文件头校验通过 if (move_uploaded_file(...)) { echo "Success"; } }

这里已经算比较好的白名单+文件头校验了,但仍然没有对文件内容做深度扫描。如果攻击者把源码中的图片马改成包含图片头部的同时,在尾部塞入<?php system($_GET['c']); ?>,再配合文件包含漏洞去执行,High等级一样会失守。这也说明,单点防护永远是不够的,纵深防御才是正道。

代码层面的加固,最终还是要落到“删除一切文件包含入口”和“对所有用户可控输入做白名单校验”这两件事上。

5. 常见问题与排查技法实录

5.1 图片马已落地,但访问后显示下载而不是执行

这是我在靶机上最容易遇到的情况。上传后直接访问http://127.0.0.1:8080/uploads/shell.jpg,浏览器直接把图片下载了,说明服务器没有把该文件交给PHP解析。排查思路是:

  • 先确认文件名后缀,如果只是.jpg,Apache/Nginx默认不会执行,你需要借助文件包含漏洞或者把后缀改成.php(如果还能上传)。
  • 检查Apache的AddHandler配置,确认是不是所有.php都被交给PHP处理。
  • 检查Nginx的fastcgi_pass配置,location块是否匹配了.php请求。
  • 如果用的是Apache2,可能是.htaccess中的php_flag engine on配置被禁用了,比如AllowOverride None。

5.2 图片马能上传成功,但PHP代码不执行

靶机环境里出现这种情况通常有两个原因。一是你上传的是.jpg后缀,但应用没有文件包含漏洞,所以即使里面藏了代码也不会触发;二是你用了<?php ...?>完整标签,但PHP配置里short_open_tag关闭对<?...?>这种短标签的影响——完整标签不受影响,所以这个可能性较小,多半还是解析链路的问题。

我在测试中遇到过一个迷惑性很强的坑:把恶意代码追加到GIF末尾,上传成功后直接访问URL显示的是GIF图片,看着一切正常,但加上菜刀连接时用http://127.0.0.1/uploads/shell.php的地址,发现连接不上。后来定位到是因为我的靶机上那个上传目录压根没有解析PHP,需要在Apache里给图片后缀加上AddHandler才能模拟出真实生产环境的那种误配置。

5.3 批量扫描图片后出现误报

检测脚本把一张正常图片判定为有问题,多半是因为图片的EXIF信息中包含版权文字,里面恰好有system或者assert之类的英文单词。这种情况要处理误报,我的做法是:先看命中的特征码具体是哪一条,如果是<?php这种高置信度特征,误报率极低;如果是system(这种字符串,就需要确认它是不是出现在二进制数据区域,还是只是文本元数据。用十六进制编辑器定位上下文后再判断,就能大幅降低误报率。

5.4 清理图片马之后,网站还是被反复入侵

这几乎是每个做过应急响应的安全从业者都会遇到的问题。单纯删除上传目录里的图片马是不够的,因为攻击者很可能已经利用它写入了第二个后门(比如修改了.htaccess或.user.ini,或者在主题、插件目录放了新webshell)。我整理了一套自己的排查流程,分享出来供参考:

  1. 先断网或摘除对外服务,避免攻击者继续远程操作。
  2. 全盘搜索近期新增的PHP文件,尤其注意Web根目录、上传目录、缓存目录。用find按时间筛选。
  3. 检查.htaccess、.user.ini这类文件是否被加入自动包含或重写规则。
  4. 对比网站源码备份,找出最近被修改过的文件,重点看eval、assert、base64_decode等敏感函数出现的位置。
  5. 清掉Web日志中的攻击痕迹后,修改数据库账号密码,建议同时升级应用版本和PHP版本。

最后一步在靶机上同样适用:重置DVWA环境永远比手动清理更彻底,这也是我推荐你初期在靶机环境练习的原因,可以大胆试错,不用担心恢复成本。

收个尾,说几句实操体会

我在DVWA上把图片木马从上传到执行完整复现过之后,最大的改变不是掌握了什么新的攻击手法,而是对所有“看起来是图片”的文件产生了警惕。写后端接口的时候,我总会多问一句:这个文件真的被当成图片用了吗?如果哪天业务需要,另一个模块会不会把它当成脚本去解析?这些设想往往能提前堵住很多漏洞。

关于检测与防御,我的体会是:技术的对抗永远是动态的,没有一劳永逸的防护。图片木马也在进化,现在已经有能绕过getimagesize校验的二次封装、有利用GD库缺陷制作的畸形图片、还有用压缩编码隐藏payload的手法。所以无论你是安全工程师还是应用开发,最好都养成两个习惯:一是上传文件的校验永远基于内容而不是后缀和声明;二是日志一定要留够,分析能力比单点防护更能救你于水火。

最后再分享一个靶机练习的小技巧:每次做完一个漏洞的实验,不要急着刷新重来,先在系统中留几个备份快照,把成功和失败的过程都记录在案。这个习惯让我在复盘时能快速对照不同攻击路径的流量特征,也让我对防御思路有了更完整的认识。安全这条路,亲手拆过靶机的人,才真正懂得如何筑牢防线。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 6:09:59

PLC在邮件分拣机中的应用:位置跟踪与通信调试全解析

分拣准确率要做到99.9%&#xff0c;当用户把这句话丢给我的时候&#xff0c;我就知道这个项目没那么简单。智能邮件分拣机&#xff0c;表面上看就是把一封邮件从入口送到对应格口&#xff0c;快一点、准一点、别丢件、别送错。可真正做起来才知道&#xff0c;每一次扫码、每一个…

作者头像 李华
网站建设 2026/10/22 6:09:06

大模型从原理到落地:训练成本、部署优化与行业应用全景解析

你只要认真读完这一篇&#xff0c;大模型对你就不再有黑盒感。我不会跟你聊空洞的趋势&#xff0c;也不堆那些看了就忘的名词&#xff0c;就直接讲清楚大模型到底是个什么东西、训练它为什么那么烧钱、部署的时候都在调些什么参数、各行各业又是怎么把它用起来的。这篇文章从算…

作者头像 李华
网站建设 2026/10/22 6:09:05

扫地机器人全覆盖路径规划:内螺旋算法MATLAB仿真实现与调优

扫地机器人的路径规划&#xff0c;跟很多人想的不太一样&#xff1a;它最核心的诉求不是“怎么从A点走到B点”&#xff0c;而是“怎么把整块地方都走到”。这个全覆盖路径规划问题&#xff0c;听起来简单&#xff0c;实际上一做就会撞上覆盖率、重复率、边界处理和死循环这些坑…

作者头像 李华
网站建设 2026/10/22 6:08:59

具身智能时代:从规则编程到数据驱动,人的角色如何重构

1. 从“人指挥机器”到“机器自己学”&#xff1a;一场静悄悄的权力转移我做了十来年机器人系统开发&#xff0c;从最早的PLC逻辑控制&#xff0c;到后来上ROS做感知规划&#xff0c;再到现在带着小团队搞具身智能落地&#xff0c;最大的感受是&#xff1a;我们这一行正在经历一…

作者头像 李华
网站建设 2026/10/22 6:08:59

Gemini 4 Argon 端侧推理与多模态实战:Android 开发者的工程落地指南

1. 这次更新到底改了什么&#xff1a;从开发者的视角拆解先把结论摆在前面&#xff1a;Gemini 4 Argon 这一代模型对 Android 开发者的意义&#xff0c;不在于"又多了一个能聊天的 AI"&#xff0c;而在于它把端侧推理、多模态输入、长上下文这三件事同时往前推了一大…

作者头像 李华
网站建设 2026/10/22 6:08:58

AI写Rust代码总编译失败?四大断点与实战协作方案

1. 项目概述&#xff1a;为什么AI写Rust代码会频频“断电”“当AI写代码遇见Rust为什么会卡壳”——这个标题不是调侃&#xff0c;而是我过去八个月在某跨平台系统重构项目中反复验证的真实现象。作为长期用Rust做嵌入式网关、CLI工具和WASM后端的开发者&#xff0c;我从2023年…

作者头像 李华