<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>iframe沙箱隔离 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《为 AI 生成的 HTML 构建安全隔离的预览环境》</title><link>https://channel.meo-ai.com/posts/735</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/735</guid><pubDate>Sat, 31 Oct 2026 00:07:59 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《为 AI 生成的 HTML 构建安全隔离的预览环境》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23Web%E5%AE%89%E5%85%A8&quot; title=&quot;#Web安全&quot;&gt;#Web安全&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B&quot; title=&quot;#前端工程&quot;&gt;#前端工程&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23AI%E7%94%9F%E6%88%90%E5%86%85%E5%AE%B9&quot; title=&quot;#AI生成内容&quot;&gt;#AI生成内容&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23iframe%E6%B2%99%E7%AE%B1%E9%9A%94%E7%A6%BB&quot; title=&quot;#iframe沙箱隔离&quot;&gt;#iframe沙箱隔离&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CSP%E5%86%85%E5%AE%B9%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5&quot; title=&quot;#CSP内容安全策略&quot;&gt;#CSP内容安全策略&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23postMessage%E5%AE%89%E5%85%A8&quot; title=&quot;#postMessage安全&quot;&gt;#postMessage安全&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5&quot; title=&quot;#同源策略&quot;&gt;#同源策略&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23srcdoc%E6%B8%B2%E6%9F%93&quot; title=&quot;#srcdoc渲染&quot;&gt;#srcdoc渲染&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;这是一篇面向“AI 生成 UI 必须渲染到某处”这一现实需求的安全工程文章。作者以一个未经防护的 &lt;code&gt;srcdoc&lt;/code&gt; iframe 预览为起点，用三种攻击方式（读取父页面、劫持窗口跳转、向外部服务器回传数据）逐一击破，最终给出四层防护组合：最小化沙箱权限、专用隔离域名、CSP 网络层管控、以及严格的 postMessage 通道校验，并强调每次权限放宽都应是可解释、可辩护的决策。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 用 &lt;code&gt;srcdoc&lt;/code&gt; 渲染 AI 生成的 HTML 看似稳妥，但生成的代码本质是“没人读过的陌生代码”，直接渲染等于把不可信脚本放进了自己应用的上下文。&lt;br /&gt;2. 无沙箱的 iframe 与宿主同源，能直接读取父页面的 DOM、&lt;code&gt;localStorage&lt;/code&gt; 和 Cookie；加上 &lt;code&gt;sandbox=&quot;allow-scripts&quot;&lt;/code&gt; 后获得不透明源，同源读取立即被 &lt;code&gt;SecurityError&lt;/code&gt; 阻断。&lt;br /&gt;3. 沙箱需要按需最小授权：默认空沙箱全封禁，只加 &lt;code&gt;allow-scripts&lt;/code&gt;；绝不能图省事同时加 &lt;code&gt;allow-same-origin&lt;/code&gt;，否则沙箱可被脚本自行移除。&lt;br /&gt;4. 沙箱管不了网络外泄——沙箱内的 &lt;code&gt;fetch&lt;/code&gt; 和图片请求仍能把数据带出去，必须用 &lt;code&gt;default-src &apos;none&apos;&lt;/code&gt; 的 CSP 在请求发出前拦截，它与沙箱是互补的两道独立防线。&lt;br /&gt;5. 沙箱化 iframe 的 postMessage 来源会序列化为 &lt;code&gt;&quot;null&quot;&lt;/code&gt;，无法用字符串白名单识别身份，必须改用浏览器填充的 &lt;code&gt;event.source&lt;/code&gt; 做身份校验，并配合载荷形状校验。&lt;br /&gt;6. 高价值场景应给预览内容单独分配一个一次性域名（如 CodePen 用 &lt;code&gt;cdpn.io&lt;/code&gt; 渲染结果），即使沙箱被逃逸，攻击者也落在“什么都没有”的原点上。&lt;br /&gt;7. 实战落地顺序与直觉相反：先建空沙箱再逐项加权限、用隔离域名承载、叠 CSP、严格校验消息通道；放宽策略（如为 CDN 图片加 &lt;code&gt;img-src&lt;/code&gt;）必须是能明确说出理由的决策。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html/&quot;&gt;https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;An iframe with srcdoc feels like a safe place to render HTML a model wrote. It isn&apos;t. Three tests show how the preview can read your page, escape the frame, and phone home, and four layers of protection close each hole.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;blog.master.dev&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Building an Isolated Preview for AI-Generated HTML&quot; src=&quot;/static/https://cdn4.telesco.pe/file/vCHUiG-xOP0QRaFtv9gDjcRNHRFu_a8v6mMG0VpIUzfFdurxCR7QpSMh5V6ODuVpzPEV09f7FaPMsvjVCGL42F1eGfBN8YY1lBpHLtXWwKH0BdNsMVbf1fqIVNK0u-M8xorEBbB0BqZh2_ytQbFA9tu_mmJbw92LF2ikp7SVGKDR9DPd5XtXzJyfarITNe7KBrRPV3HEILZ1htyiBZ-bHSdAOiXZlBMQeyHoP79AyJjd22HZV2iEx_FpUfDJ_BOvochJM0Ww3kUEDsM_cD01UqHEl1w0D4Ig_1qa1RRSPeOXIxgy5GP1fRfa1PxIiIcT5sAA88bOfXwRTlvzJMZgxA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Building an Isolated Preview for AI-Generated HTML&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;An iframe with srcdoc feels like a safe place to render HTML a model wrote. It isn&apos;t. Three tests show how the preview can read your page, escape the frame, and phone home, and four layers of protection close each hole.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>