Search: #Web安全

  1. 《为 AI 生成的 HTML 构建安全隔离的预览环境》

    《为 AI 生成的 HTML 构建安全隔离的预览环境》

    标签:
    #Web安全 #前端工程
    #AI生成内容 #iframe沙箱隔离 #CSP内容安全策略 #postMessage安全 #同源策略 #srcdoc渲染

    总结:
    这是一篇面向“AI 生成 UI 必须渲染到某处”这一现实需求的安全工程文章。作者以一个未经防护的 srcdoc iframe 预览为起点,用三种攻击方式(读取父页面、劫持窗口跳转、向外部服务器回传数据)逐一击破,最终给出四层防护组合:最小化沙箱权限、专用隔离域名、CSP 网络层管控、以及严格的 postMessage 通道校验,并强调每次权限放宽都应是可解释、可辩护的决策。

    文章要点:
    1. 用 srcdoc 渲染 AI 生成的 HTML 看似稳妥,但生成的代码本质是“没人读过的陌生代码”,直接渲染等于把不可信脚本放进了自己应用的上下文。
    2. 无沙箱的 iframe 与宿主同源,能直接读取父页面的 DOM、localStorage 和 Cookie;加上 sandbox="allow-scripts" 后获得不透明源,同源读取立即被 SecurityError 阻断。
    3. 沙箱需要按需最小授权:默认空沙箱全封禁,只加 allow-scripts;绝不能图省事同时加 allow-same-origin,否则沙箱可被脚本自行移除。
    4. 沙箱管不了网络外泄——沙箱内的 fetch 和图片请求仍能把数据带出去,必须用 default-src 'none' 的 CSP 在请求发出前拦截,它与沙箱是互补的两道独立防线。
    5. 沙箱化 iframe 的 postMessage 来源会序列化为 "null",无法用字符串白名单识别身份,必须改用浏览器填充的 event.source 做身份校验,并配合载荷形状校验。
    6. 高价值场景应给预览内容单独分配一个一次性域名(如 CodePen 用 cdpn.io 渲染结果),即使沙箱被逃逸,攻击者也落在“什么都没有”的原点上。
    7. 实战落地顺序与直觉相反:先建空沙箱再逐项加权限、用隔离域名承载、叠 CSP、严格校验消息通道;放宽策略(如为 CDN 图片加 img-src)必须是能明确说出理由的决策。

    URL:https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html/ Building an Isolated Preview for AI-Generated HTML

  2. 《用 AI 定制框架替换 Next.js:一个静态网站的“超个性化”重构实验》

    《用 AI 定制框架替换 Next.js:一个静态网站的“超个性化”重构实验》

    标签:
    #Web开发 #前端工程 #AI辅助编程 #NextJs #静态网站 #自定义框架 #性能优化 #Vercel部署

    总结:

    作者 Max Leiter 用 Claude Code(Fable 5 架构、Opus 实现)在约 3 小时内把个人博客从 Next.js 迁移到了一个为站点量身定制的静态构建框架。新方案把全站编译成纯 HTML,按需加载少量 Preact islands,结果页面体积、Lighthouse 分数、构建时间全面大幅优于 Next.js;代价是放弃了框架生态的无数隐性优化,后续维护与安全问题也由自己承担。

    文章要点:

    1. 作者让 AI “按需造一个比 Next.js 更快的专属框架”,核心思路是只保留这个网站真正用到的 Next.js 功能,而不是继续背着整个框架跑。

    2. 新框架本质上是一个构建脚本:读取文章目录,用 React 在服务端渲染每条路由为静态 index.html,再按 Vercel Build Output API 输出,M2 MacBook 上热构建只要约 0.5 秒。

    3. 性能提升非常夸张:首页 JS 从 208 KB 降到 2.3 KB(约 -99%),移动端 LCP 从 2.4 秒降到 1.3 秒,整页重量从 1153 KB 降到 78 KB,Lighthouse 直接冲到 100 分。

    4. 博客文章页同样收益明显:HTML 更小、JS 只剩 2.3 KB,移动端 LCP 从 2.2 秒降到 1.1 秒,页面重量从 405 KB 降到 57 KB,软导航也改成更轻的 partial/prerender 方案。

    5. 交互没有消失,而是改成“islands”模式:桌面窗口管理器和命令面板用 Preact 组件按需水合,命令面板首次按 Cmd+K 才加载,Preact 兼容层只有约 7 KB,比 React 的 52 KB 轻很多。

    6. 构建链路保留原有体验:MDX 仍在构建期用同一套 remark/rehype 插件编译,shiki 在构建时同时输出两套主题的代码高亮,所以切换主题不需要额外 JS。

    7. AI 还写了一个“parity harness”,对旧站 101 条路由做快照,对比 head、正文和代码块,结果抓出了 8 篇未发布文章泄漏进 RSS、以及一张 404 的 OG 图这类真实问题。

    8. 整个实验花费约 669 美元,API 运行 8 小时 27 分,代码新增 20914 行、删除 2022 行,大约用掉 Claude Code 20x 订阅额度的 10%。

    9. 作者认为这种做法的意义在于“只 vendor 你真正需要的东西”:框架被压缩到约 5000 行,人和模型都更容易审查,也能减少供应链攻击面。

    10. 缺点也很直白:Next.js 里成百上千个小优化和边界处理 AI 未必都知道或能复现;没有现成的 agent 工具链集成;安全修复不再自动从上游来;而且网站一旦有问题,bug、安全、功能需求都归你自己管。

    11. 文章还记录了两个浏览器层面的坑:Chrome 的跨文档 view transitions 会因 head 里的外部 module script 静默跳过入场动画,所以 runtime 必须内联;Safari 对 Speculation Rules 的 feature detection 需要同时检查 API 支持和 document.prerendering。

    12. 作者最后判断:未来可能会出现更多“vendoring”和 agentic rewrite,也就是所谓“slop forks”;更激进的猜测是,框架本身可能会消亡,因为框架真正值钱的是沉淀下来的庞大知识,而这些知识未来可能被蒸馏成 skills 或某种新标准。

    URL:
    https://maxleiter.com/blog/thank-u-next thank u, next | Max Leiter

  3. 《unbash:零依赖的 Bash 解析器》

    《unbash:零依赖的 Bash 解析器》

    标签:
    #Web开发 #NodeJs #Bash解析 #TypeScript #AST #命令行工具 #静态分析

    总结:

    文章要点:
    1. 定位清晰:unbash 是一个用 TypeScript 编写的、零依赖的 Bash 解析器,能将 Bash 源码(命令、脚本或嵌入在其他格式中的 shell 代码)解析为带类型和源码位置的 AST,且不执行代码
    2. 适用场景丰富:可用于权限审核、静态盘点脚本中的可执行文件和依赖引用、将 curl 等命令结构化导入、为粘贴的 Bash 代码附加诊断信息、构建可视化解释、以及安全地查找和迁移命令调用
    3. 语法支持全面:涵盖命令、控制流、管道、重定向、赋值、复合语句、参数扩展、进程替换、heredoc、算术表达式等,嵌套命令在参数、数组索引、算术表达式中仍保持结构化
    4. 容错能力强:对于畸形或不完整的输入,会返回尽力而为的部分 AST,并附带带源码位置的错误信息,适合处理编辑器输入或用户粘贴内容
    5. 性能碾压对手:在多个基准测试中,解析吞吐量远超 tree-sitter-bash(约 717 倍)、sh-syntax(约 92870 倍)和 bash-parser(约 275291 倍),包体积仅 80KB 压缩后 19KB
    6. 与竞品差异化明显:相比 tree-sitter-bash 提供的是可执行语法的类型化 AST 而非 CST;相比 sh-syntax 无需 WASM 且 API 更轻量;相比 bash-parser 支持更多 Bash 特性(如 [[ ]]、(( ))、herestrings、process substitution 等)且具备错误恢复能力
    7. 与 shellcheck 的互补关系:unbash 专注于"解析结构",不做语义分析;以下场景推荐用 shellcheck 而非 unbash:
    - 检查变量是否已定义或是否被引用(如未引用变量 $var 可能引发 word splitting)
    - 检测命令是否存在及其参数合法性(如 git --不存在的参数 语法正确但运行会报错)
    - 识别常见陷阱和反模式(如 cat file | grep pattern 可简化为 grep pattern file)
    - 检查权限相关风险(如 rm -rf /$undefined_var 的潜在危险)
    - 提供可操作的修复建议(shellcheck 会直接给出 SC 规则编号和修复方案)
    - 对脚本进行全面的最佳实践审查(POSIX 兼容性、可移植性建议等)

    URL:https://github.com/webpro-nl/unbash GitHub - webpro-nl/unbash: Fast 0-deps bash parser written in TypeScript

  4. 《为什么我放弃Next.js和RSC,回归传统SPA与独立后端》

    《为什么我放弃Next.js和RSC,回归传统SPA与独立后端》

    标签:#前端 #Web开发 #React #NextJS #React_Server_Components #SPA #架构设计 #安全 #TanStack #Hono

    总结:

    作者回顾了自己从Next.js忠实用户到拥抱App Router/RSC,最终回归传统SPA+独立后端的完整历程。文章深入分析了RSC架构带来的心智负担、序列化开销和安全风险,结合2025-2026年多起严重CVE漏洞,论证了将渲染框架与安全边界解耦的必要性,并分享了当前基于React Router+Vite+Hono的简洁技术栈。

    文章要点:

    1. Next.js的黄金时代:Pages Router时期心智模型清晰,服务端/客户端边界一目了然,文件路由简单易懂,部署零成本
    2. App Router带来的混乱:Server/Client Component区分成为负担,"use client"指令传染性强,开发/构建/生产环境缓存行为不一致,服务端客户端边界变得不可见
    3. 安全漏洞敲响警钟:2025年CVE-2025-29927中间件绕过(CVSS 9.1)、2025年底RSC核心包10分满分漏洞CVE-2025-55182、2026年初多起Server Function DoS漏洞,攻击面集中在服务端渲染和反序列化环节
    4. TanStack并非避风港:2026年5月TanStack遭遇供应链攻击,42个包被投毒,说明换框架不能免疫风险,减少依赖面才是关键
    5. 序列化是根本原因:RSC的"无缝"本质是分布式系统的序列化问题,函数、类实例、错误栈都无法透明穿越边界,反序列化不可信输入成为高危攻击面
    6. 当前架构选择:React Router框架模式+Vite纯SPA(仅营销页预渲染)+ Hono独立后端,API通过显式HTTP调用,无RSC负载,无服务端序列化
    7. 安全设计原则:认证授权在API层强制执行,前端中间件只做UX跳转,CORS/CSRF/验证码/限流全部在可控的后端实现,与渲染框架彻底解耦
    8. 核心收获:架构清晰可指认、无序列化税、前端攻击面趋近于零、后端语言自由选型、依赖更少爆炸半径更小——"无聊"在软件工程里是赞美

    URL:https://dev.to/zulikram/why-i-walked-back-from-nextjs-and-rsc-to-a-plain-spa-and-a-separate-backend-4k8p