新闻详情

新闻详情

首页 / 资讯中心 / 详情

AI编程插件供应链攻击:Plugin4Shell静默替换原理与自查指南

发布时间:2026/9/28 17:48:22来源:尧图网络
AI编程插件供应链攻击:Plugin4Shell静默替换原理与自查指南
上个月我帮一个创业公司的朋友排查环境问题他们的开发机出现了可疑的定时外连请求流量不大但目标地址看起来完全陌生。查了很久最后问题出在一台开发机的 VS Code 扩展目录里——某个 AI 编程插件被换成了一个外壳版本界面、补全、对话功能都正常但每次启动都会默默加载一段额外的脚本把当前项目里的文件路径、代码片段、环境变量打包送出去。这个操作手法最近被安全圈归进了一个叫 Plugin4Shell 的攻击模式里。这篇文章就干两件事把 Plugin4Shell 的原理拆开讲清楚再给一份能直接照做的自查清单。内容不涉及具体平台漏洞而是从供应链攻击的通用视角出发解释为什么 AI 编程插件最容易中招、静默替换是怎么一步步发生的以及作为开发者你花二十分钟就能排查出自己有没有踩坑。适合所有在用 AI 编程助手的开发者也适合团队里负责技术安全的人参考。1. 先搞清楚Plugin4Shell 到底是个什么东西1.1 不是什么新漏洞而是一整套攻击思路第一次看到 “Plugin4Shell” 这个名字的朋友可能会以为是 2025 年的某个新 CVE 漏洞编号其实不是。这个命名很明显是借了 Log4Shell 的梗——2021 年 Log4j 那个让全球 Java 服务焦头烂额的远程代码执行漏洞。安全圈习惯用 “XXXShell” 来命名“能让攻击者在目标机器上拿到命令执行能力”的漏洞或攻击手法“Plugin4Shell” 指的就是一个 AI 编程插件变成了攻击者手里的命令执行通道。它不是单点漏洞而是一类“插件供应链攻击”的统称。攻击者不依赖某个具体的越界漏洞而是利用插件分发机制、更新机制和用户信任习惯中一系列普遍存在的松懈点把一个功能正常的 AI 插件在用户毫不知情的情况下替换成恶意版本。整个过程没有告警、没有弹窗、没有界面异常所以叫“静默替换”。这背后的关键逻辑是现在的 AI 编程插件不再只是 IDE 里的一个小工具它有语言模型推理、上下文采集、代码分析、自动补全、甚至自动执行命令的能力。插件本身的能力边界极大一旦插件实体被替换攻击者得到的不是一个漏洞点而是开发者工作环境中一个长期稳定的“内鬼”。1.2 为什么“静默替换”是比直接报毒更危险的事很多人认为只要有杀毒软件和 IDE 自带的应用商店审核恶意插件很难活着走到自己电脑里。这个想法在“攻击者直接上传一个显性后门插件”的场景下是成立的——这类恶意插件通常很快被标记、下架、查杀。但 Plugin4Shell 并不是这样操作它的核心特征是“替换”而不是“新增”。替换指的是插件原有的合法功能全部保留恶意代码以附加模块、依赖补丁或更新补丁的形式混入其中。用户打开它跟往常一样有补全、有对话、有代码解释体验没有任何异常。你的 IDE 不会报错杀毒软件扫描整体散列也大概率是干净的因为你看到的还是一个“正常的插件包”只是里面多了一层嵌套在合法逻辑里的小动作。我习惯用一个类比来理解这件事正常情况是你家请了个保姆她的身份没问题服务态度也好静默替换是保姆被换成了另一个人但穿着同样的衣服、用同样的钥匙进门、做饭口味几乎一样你根本不会去核对眼前这个人是不是当初签合同那位——直到某天你发现家里少了东西你才意识到问题早就在了。防御静默替换最尴尬的地方就在这里等你能察觉到异常的时候恶意代码通常已经运行了很久数据可能已经传出去了好几个星期。2. 为什么偏偏是 AI 编程插件2.1 权限极大能读代码、能跑命令、能上外网AI 编程插件在设计之初就被赋予了比普通扩展大得多的权限。要理解代码上下文、要读取当前打开的文件、要搜索整个工作区、要调用编译工具、要执行终端命令还要把代码发出去给大模型做推理。这些需求对用户来说是实用功能对攻击者来说是现成的“攻击面”。以 VS Code 扩展为例一个插件可以申请的安全能力包括但不限于读取工作区任意文件、监听文件变化、执行 shell 命令、发起任意网络请求、读取环境变量、修改用户配置。JetBrains 系插件同样有类似的高权限模型。更不用说很多 AI 插件在本地会保存会话历史、上下文缓存、甚至是用户的 API Token——这些数据全部躺在插件自己的目录里权限位通常只有当前用户没有额外的加密隔离。权限大不是问题问题在于很多开发者完全没有意识到这个权限边界有多大。装插件的时候几乎没人会去认真看权限清单因为 AI 工具不开这些权限就没法正常工作——你总得允许它读代码它才能帮你理解代码。这种“为了体验而主动让渡权限”的行为恰好成了 Plugin4Shell 能发挥效果的前提。2.2 数据价值极高源码、密钥、上下文记忆开发机的数据价值是所有终端设备里最高的。源码是企业最核心的资产代码注释里偶尔还有数据库连接方式、内部 API 地址、甚至审核不过关的硬编码密钥。而 AI 编程插件的会话上下文里通常会保存开发者最近一段时间的全部思考记录、关键代码片段、配置文件内容。对一个攻击者来说一次性拿到这些数据远比自己辛辛苦苦去渗透一个业务系统更划算。更微妙的是代码“出网”这件事已经被 AI 编程插件日常化了。开发者对“编辑器主动向上传代码”早已习以为常防火墙也不可能把所有 IDE 进程的连接都拦下来——否则 AI 补全功能直接废掉。这就给了 Plugin4Shell 一个天然伪装恶意代码在后台外传数据时从网络流量角度看跟插件正常把代码发送给大模型服务商没有任何明显区别。攻击者要做的只是把自己的服务器地址混进请求列表或者通过代理层转发一次就能把外传行为完全隐藏在“AI 插件正常联网工作”的表象下。我在实际排查问题时发现很多公司的安全设备对 IDE 进程出站连接是放行的因为误报率太高这进一步加大了静默替换的隐蔽性。2.3 信任链上的用户盲区谁看更新日志呢插件生态的信任模型本质上是“用户信任市场市场信任作者作者信任依赖库”。这串信任链很长但每一环的验证都很薄弱。市场方面插件商店对上架插件的审查主要靠自动化扫描和用户举报恶意插件能快速下架但插件市场的分发节点多、镜像源多、离线安装包也多下架不代表它不再流通。作者方面一个插件的作者账号被盗、项目转让、甚至是某天不再维护了都可能导致插件源头失去控制——攻击者通过接管作者账号发布“更新”是供应链攻击里屡试不爽的套路。依赖库方面AI 插件几乎都依赖 npm 或 pip 生态里的第三方包而依赖链上任何一个包被污染最终进入插件本体的代码同样可以做到完全不可见。用户这一环是最薄弱的。绝大多数开发者安装插件后从不看更新日志自动更新开着就不管了插件上一次是什么时候更新的、更新了哪些内容、发布者 ID 是否变化完全不在关注范围内。Plugin4Shell 攻击成功率高很大程度上不是攻击者技术有多神而是开发者的信任习惯太“粗放”了。3. 静默替换的完整攻击链拆解3.1 入口一插件市场的名称仿冒与发布者冒认第一种常见入口是往用户眼皮底下塞一个“看起来一样”的插件。攻击者会在插件市场上注册与热门的 AI 插件名字极其相似的新插件比如官方叫copilot-plus他就注册copilot-plsu、copilet-plus或者注册一个同名的第三方发布者再配合刷下载量、刷好评让这个仿冒插件出现在搜索结果前列。这类仿冒插件往往会照搬原插件的功能逻辑直接把原插件的开源版本拖下来重新打包内置原版的完整功能然后加上一小段恶意逻辑。用户通过搜索安装时第一眼看到的是名字和图标都对、下载量很高、用起来也没问题的插件没有谁会去认真核对发布者的邮箱、主页和公司主体是不是官方那个。我在帮朋友排查时就碰到过这种情况——团队里有人为了让 Copilot 类的功能在旧项目里也能用从插件市场里挑了个“平替版”名字跟官方就差一个字母发布者是一个看起来没什么破绽的独立开发账号。结果就是这台机器成了整个内网的突破口。仿冒插件是最容易预防的一类但它依然能在很多团队里成功说明大家安装插件的习惯实在太“逛应用商店化”了。3.2 入口二依赖链污染与依赖包劫持就算你装的插件是官方正版Plugin4Shell 依然可以通过依赖链达成静默替换。现代 AI 插件的体量动辄上百 MB其中八成以上是依赖的第三方库代码。官方维护者也要用的 npm 包、pip 包、Python 包任何一个包的维护者账号被盗、包名被抢注、或者背后的私有仓库源被篡改攻击者就能在完全不触碰插件自己代码的情况下让恶意代码被“正常”地安装进你的插件目录。这跟前面说的仿冒插件核心差别在于依赖链污染走的是“合法插件 恶意依赖”的路线。插件本身是正版作者没有发布恶意更新但插件启动后加载进来的第三方库已经被替换了。由于依赖库在打包时往往被混淆、压缩、合并到庞大的 dist 文件里代码评审工具很难发现里面混入的额外逻辑。我自己在给项目做扩展体检时曾经试着静态扫描一个插件的 bundle.js那个文件有 8 万多行压缩过的代码想靠肉眼找出可疑逻辑根本不现实只能靠检索特征 API 来圈定范围。这也是很多安全团队对插件依赖链攻击感到头疼的原因正版插件不值得怀疑依赖却实在看不出问题。3.3 入口三自动更新机制滥用与更新包伪造第三种入口是自动更新机制。插件更新是日常开发中最常见、用户最不带防备的动作之一而攻击者盯上的恰恰就是这一幕。自动更新被滥用至少有两种典型场景。第一种插件作者账号被接管攻击者以“新版功能优化”的名义推送恶意更新包服务端签名校验形同虚设客户端直接就拉下来安装。第二种插件不走官方更新通道而是支持自定义更新源或从内网插件仓库拉取攻击者只要在开发机或内网链路上做过手脚把更新地址替换成自己控制的服务器用户下一次启动 IDE 看到 “插件已更新至新版本” 的提示时恶意代码已经装好了。最麻烦的是很多 AI 插件的自动更新是默认开启、静默安装的你不点开设置根本不知道它什么时候更新了。就算你注意到更新日志恶意更新也可能把日志文本改成安全无害的描述普通用户完全无法分辨这个更新到底是官方还是伪冒。我再强调一遍自动更新本身是为了方便但当你对更新来源完全没有验证能力时方便就会变成攻击面。3.4 入口四本地文件系统替换与配置注入前面三条入口都是“攻击者从远端把恶意插件送到你电脑上”还有一条完全不需要网络攻击的入口本地文件直接替换。如果攻击者已经通过钓鱼、漏洞利用或者其他手段拿到了你开发机的普通用户权限接下来要做的事就很简单——找到插件目录把原插件的入口文件改名放进一个同名文件或者在插件的package.json里增加扩展点、调整main入口指向恶意脚本。整个过程不需要任何漏洞利用就是文件操作杀毒软件几乎不太可能报因为这些文件是 IDE 插件目录里每天都会被读写、更新的正常文件。除了替换文件配置注入是更隐蔽的变体。IDE 的用户配置VS Code 的settings.json、JetBrains 的配置目录是可以被程序修改的。攻击者往配置里增加一条“加载额外环境变量”或者“注册一个开机启动的执行任务”IDE 下次启动时就会执行它而这在用户看来只是配置变了几个字段而已。你要发现这类替换靠的不再是文件哈希而是对配置内容的敏感性——这也是普通开发者最容易忽略的盲区。3.5 从替换到执行一次抽象的攻击链全景把上面四个入口串起来Plugin4Shell 的一次完整攻击流程大致是这样攻击者选定一个目标开发者常用的 AI 编程插件通过插件市场仿冒、依赖链污染、作者账号接管或本地文件篡改这四条路径之一把恶意插件版本变成目标插件的新形态。恶意插件保留原有功能逻辑保证用户无感额外逻辑以“辅助模块”“更新补丁”“配置项”的形式藏在合法代码中。用户下次启动 IDE 或触发一次自动更新时恶意代码完成加载它先读取插件现有的合法模块然后启动一个后台任务比如注册定时器、监听文件事件或者直接发起网络连接。还有更隐蔽的——恶意代码会主动检查开发机是否处于高价值环境有内网路由、有常见的云厂商凭据文件以此决定是否“升级”出更多行为。恶意代码对外通信伪装成 AI 插件的正常出站流量把源码摘要、密钥、环境变量、内网扫描结果一并通过 HTTPS 传输给攻击者的服务器。攻击者根据拿到的凭据进一步向内网渗透或者把开发机的敏感数据打包出售整个过程可能持续数周甚至数月而不被发现。以上只是抽象归纳不是某一个具体样本的唯一路径。不同插件、不同平台、不同环境的攻击链细节都会有差异但“保留正常功能 注入静默逻辑 伪装正常流量”这三个要素是 Plugin4Shell 的一致核心。4. 一份能直接照做的自查清单下面这份清单是我自己在检查和帮别人排查时逐步沉淀下来的不需要专业安全工具就能执行。建议找一个不那么赶时间的下午逐项过一遍总共大概 20 分钟到半小时。4.1 插件安装来源与清单审计先打开你 IDE 的扩展管理界面逐个看下面四项插件是不是从官方市场安装的还是手动安装的 vsix 离线包手动安装的 vsix 来源是否可信。发布者名称是不是插件官方主体的名称。注意发布者显示名和发布者 ID 都要看显示名可以随便起ID 是唯一标识。插件的安装时间和最近更新时间的节点和你的实际操作能不能对上。如果显示最近更新是某个你完全没操作的时段就要特别注意。插件数量是否明显超出你的实际使用范围。我经常发现有些开发者电脑里装了十几个根本用不上的插件原因早已记不清这些插件是最值得清理的对象。如果用的是 VS Code可以在终端里执行一条命令把完整清单打出来带版本号和安装来源code --list-extensions --show-versionsJetBrains 系可以在插件管理界面里按列表导出现有插件。拿到清单后对照一下有没有一个插件是“你认识它但想不起什么时候装的”尤其是名字跟 Copilot、CodeGeeX、通义灵码这些热门工具有点相似但又不是同一家的。4.2 插件目录与文件完整性检查插件清单只能说明装了什么不能说明装的是不是“真货”。要判断文件有没有被动过手脚直接看扩展目录。VS Code 扩展目录在Windows%USERPROFILE%\.vscode\extensionsmacOS / Linux~/.vscode/extensionsJetBrains 插件的目录通常在其配置目录的plugins文件夹下具体路径可在Help / Edit Custom Properties中查看idea.plugins.path的指向。进目录后重点检查三类可疑情况有没有.vsix、.zip之类的安装包残留尤其不是你主动下载的。package.json里的main入口文件对应的实际文件是否真实存在文件修改时间是否和其他文件差别很大。有没有可疑的node_modules里混着eval(、new Function(、child_process、WebSocket、http.request等特征调用。我写了一个足够简单的静态扫描小脚本用来在插件目录里圈出可疑文件方便人工复核。它只是一个搜索器不会去执行插件里的任何代码import os, re, sys root sys.argv[1] if len(sys.argv) 1 else .\\extensions patterns { eval: r[^\\w]eval\(, child_process: rchild_process|exec\(|spawn\(, network: rhttps?://|WebSocket|net\\.connect, env_dump: rprocess\\.env|os\\.environ, dynamic_import: rimport\\([^\\x27\\x22][\]?\), } for dirpath, _, filenames in os.walk(root): for f in filenames: if not f.endswith(.js) and not f.endswith(.ts): continue path os.path.join(dirpath, f) try: with open(path, r, encodingutf-8, errorsignore) as fh: content fh.read() except Exception: continue for name, pattern in patterns.items(): if re.search(pattern, content): print(f[{name}] {path}) break这段脚本的定位是“人工复核的索引”它会把所有带可疑特征的 JS 文件都列出来需要你逐个判断是插件的正常功能还是别有用心。看到大面积命中时不要急着删除先把命中的文件路径和插件名记录下来下一步再做针对性检查。4.3 配置、启动项与网络层面的检查插件文件没问题不代表配置和系统层没被注入。很多静默替换会把“钩子”藏在配置或系统启动项里。检查你的 IDE 用户配置文件中是否有可疑的额外字段。VS Code 的配置是settings.jsonJetBrains 的配置文件在配置目录下的options文件夹里。重点看有没有自定义的http.proxy指向陌生地址。有没有额外的settings字段指向某个可疑的本地脚本路径。有没有插件相关的配置项里包含你不认识的远程 URL。再检查系统层的可疑持久化。命令行执行以下检查看有无陌生启动项或定时任务# Linux / macOS 查看当前用户的 crontab crontab -l # systemd 用户级服务 systemctl --user list-units --typeservice # macOS 登录项 osascript -e tell application System Events to get the name of every login item # Windows 计划任务 schtasks /query /fo LIST /v环境变量也值得看一眼尤其是PATH、NODE_OPTIONS、PYTHONPATH、JAVA_TOOL_OPTIONS这类会直接影响进程加载行为的变量。如果NODE_OPTIONS里被人塞了一个--require本地路径Node 进程启动时就会自动加载那个脚本这种注入方式很多杀毒软件都不会拦。最后看网络层。打开系统的资源监控或进程网络工具把 IDE 主进程的网络连接考察一遍。对 VS Code可以看code和node进程的外连地址对 JetBrains看产品进程的外连地址。把这些连接的主域名记下来跟你用的 AI 插件官方服务域名对照。如果有一个完全陌生的域名或 IP 长时间占据连接列表这就是最直接的红色警报了。4.4 发现异常后的应急动作顺序如果前面的检查真的发现了可疑文件或可疑连接按下面顺序处理顺序很重要第一时间断开这台机器的网络但不要关机保存当前进程内存和网络状态这些都是后续分析的原始证据。不要急着“清理”先把可疑插件的目录整体打包一份副本一并备份settings.json、扩展列表、应用日志。在没有完整留证的前提下做任何删除操作都会让后续溯源失去依据。禁用所有非必要 AI 插件保留最小开发环境。至少重新生成所有能想到的密钥代码仓库的 SSH Key、云平台 AccessKey、数据库密码、各类 API Token。建议把开发机上出现过的所有 Secret 都轮换一遍宁可误伤不可泄漏。如果不能确认问题根源把系统恢复到可信快照或直接重装系统然后重新安装所有工具。这里不建议“处理完直接接着用”因为静默替换的深层痕迹很难一次性清除干净。5. 长期防护别等到被替换了才想起安全5.1 供应链信任决策少装、锁版本、看来源我在查完那台开发机之后给朋友团队列的第一条建议就是插件数量要降下来每个插件都要有明确的负责人和安装理由。具体到操作上可以这样来能不用插件解决的功能尽量用内置能力或者用少量高质量插件覆盖大多数需求。对所有常用 AI 插件关闭“自动更新”改为手动更新并且手动更新前先看更新日志和发布者有没有变化。VS Code 可以在扩展管理面板里右键插件选择“禁用自动更新”。团队内部维护一份“已批准的插件清单”把插件名、版本号、发布者 ID、负责人都记录下来。开发机上的插件应该能在这份清单里找到对应项。有条件的团队可以在内部部署私有插件仓库或统一的 vsix 分发通道让插件版本完全可控避免个体开发者在公共市场里自行挑选安装。这套策略本质上是在做供应链的可验证性——你装的每一个插件都能追溯“它从哪来、谁维护、为什么存在”。它不复杂但确实能挡住 Plugin4Shell 里最常规、也最常见的那几条路。5.2 最小权限与运行隔离插件的权限永远不会自动缩小IDE 的扩展机制决定了它的能力边界就是“当前用户的全部边界”所以只能从隔离上想办法。一个性价比很高的做法把高风险项目和日常开发拆开。开发敏感系统时在容器或虚拟机里开一个专用环境AI 插件可以装在容器内的远端环境跑这样插件拿到的只是容器内部的权限而不是宿主机的全部文件系统。VS Code Remote 容器、Dev Containers、JetBrains Gateway 都支持这种模式实际用起来并不会比本地开发慢多少但隔离效果是本质性的。另一个思路是网络出口白名单。很多路由器、防火墙或企业代理都支持按应用或进程配置出站规则你可以把 IDE 进程的出站域名限制在必要的官方服务域名范围内。即便插件里真混进了恶意逻辑只要出口被控住数据外传这一步就会被切断——这是阻断静默替换的最后一道防线。5.3 行为基线监控与定期审计一次性检查只能解决当下问题Plugin4Shell 这种攻击需要持续防。我个人比较推荐建立一个“插件目录哈希基线”在插件版本固定后把这个版本的完整目录哈希值保存一份之后每隔几天跑一次对比发现不一致就知道肯定有文件被改动。这个事不复杂一个脚本加一个定时任务就能做成本极低。网络层如果有条件给 IDE 进程单独建监控规则记录连接的目标 IP 和端口。不需要做到全量抓包只要能保留“哪个进程在什么时间访问了哪个地址”的日志就足够。真出问题时这些日志就是最直接的判断依据。另外可以关注插件作者方的安全公告。大型 AI 编程插件背后都是有公司运营的作者账号变更、域名变更、紧急安全修复这类消息一般会公开发布。定期扫一眼官方渠道比自己在市场上瞎猜要靠谱得多。写在最后我个人的体会是Plugin4Shell 能反复得手说到底靠的不是多高级的漏洞利用而是大多数开发者对“我装的插件是安全的”这件事过于想当然了。我在踩过机器被替换的坑之后现在养成了几个算不上复杂但很有效的习惯装插件之前一定花三十秒看发布者是谁、装完就锁版本、每周末扫一遍扩展目录、所有敏感项目的开发环境尽量挪进容器里。这些事不酷但真的有用。你不需要成为安全专家才能真正保护你的开发环境只需要在“信任”前面多留一个确认的步骤。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Python基于LDA主题模型的电商评论情感分析实战 2026/9/28 18:24:44

Python基于LDA主题模型的电商评论情感分析实战

简介:这份资源面向Python数据分析与文本挖掘的学习者,尤其是需要完成课程设计或电商评论分析项目的学生与开发者。它围绕LDA主题模型展开,完整覆盖从爬虫源数据预处理、评论特征名词提取,到情感副词与情感词加权打分、构建特征名词…

阅读更多 →
tsm-hub:为LLM统一Tools、MCP与Skills接入的网关架构与实战 2026/9/28 18:24:43

tsm-hub:为LLM统一Tools、MCP与Skills接入的网关架构与实战

真正让我下决心写 tsm-hub,是一次差点放弃的联调经历。当时我在做一个 LLM 驱动的自动化助手,需要同时接上自研的 Tools、两个 MCP Server,还想把 Claude Code 里那套 Skills 沿用过来。每个模块的接入方式完全不一样:Tools 要走函…

阅读更多 →
Java图书销售系统毕设全解析:业务设计、技术选型与答辩准备 2026/9/28 18:24:42

Java图书销售系统毕设全解析:业务设计、技术选型与答辩准备

每年到这个时间点,总有不少同学拿着同一个问题来找我:“博主,毕设选什么题?能不能推荐一个工作量够、答辩能说清、还不至于把自己整崩溃的题目?”如果你也在为这事发愁,那“Java图书销售系统”这个方向&…

阅读更多 →
AI辅助开发实战:构建高密度PR交付的自动化工作流 2026/9/28 18:24:42

AI辅助开发实战:构建高密度PR交付的自动化工作流

最近很多人在聊 AI 编程,GrokBot 核心成员 Lauren Tan 的分享却让我停下来反复看了很久——她一个人一个月交付 2000 个 PR。这不是团队指标,不是小组产出,是落在一个人头上的数字。你可能第一反应是这个数是不是吹的。我第一反应也是。但把细…

阅读更多 →
RAG基础构建实战:为AI Agent打造可靠的知识获取管道 2026/9/28 18:24:36

RAG基础构建实战:为AI Agent打造可靠的知识获取管道

写这篇的时候,我刚从一个大模型项目的坑里爬出来。当时我们的 AI Agent 已经能流畅聊天、调用工具,但只要问到企业内部的具体制度、产品参数、历史项目细节,它就答得吞吞吐吐,甚至睁眼说瞎话。问题很明显:模型的参数记…

阅读更多 →
Kimi K3 新手快速上手与实战指南:TaoToken 统一 Key 配置与 IDE 接入 2026/9/28 18:24:29

Kimi K3 新手快速上手与实战指南:TaoToken 统一 Key 配置与 IDE 接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉