❄️ 五分钟即可实现的 UI 功能,变成 XSS 定时炸弹

发布: (2025年12月17日 GMT+8 21:04)
6 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的文章正文内容,我将按照要求保留原始链接并将文本翻译为简体中文。

Source:

简单的脚本——一个微不足道的视觉效果——会让你的应用面临风险吗?

当然会。而且你可能根本没有意识到原因。

更糟的是,那些看似无害的小代码片段会变成闪亮多彩的定时炸弹。怎么会这样?让我给你讲一个假想的故事。

❄️ 雪花开始飘落

想象一下,你正在开发一个网站、商店或 Web 应用。

十二月来了。灯光、树木、装饰随处可见。节日气氛开始感染你。

你——或你的某位利益相关者——要求加入一点季节性的点缀。

“也许来点飘雪?” ❄️

你兴奋不已,立刻投入这项创意任务。

但等等。

积压的任务已经堆满。截止日期在尖叫。突然你想起了一件重要的事:

你很懒。 😉

显然你不会从头写这段代码。

于是你和我们一样:打开 CodePen、GitHub,甚至 Stack Overflow… 然后复制一段随机代码。

❄️ 天真的雪花脚本

/**
 * ❄️ Simple snow effect
 * Source: random blog / CodePen
 */
const snowflakes = ["❄️", "❅", "❆"];

for (let i = 0; i 

五分钟后——砰——你拥有了一个漂亮的飘雪效果。

Falling JavaScript snow and heading

你甚至没有把它提交正式的代码审查。
或者有人只匆匆看了一眼,因为嘿——这只是个视觉效果,对吧?

安全测试?
谁会去测试飘雪?

🎁 恭喜——你刚刚交付了 XSS

问题就在这里:

el.innerHTML = snowflake;

XSS(跨站脚本)发生在不可信的数据以能够被当作 HTML 或 JavaScript 执行的方式注入到 DOM 中时。

重要说明: 在此刻,这段代码尚未成为活跃的 XSS 漏洞,因为 snowflake 来自硬编码、完全可信的数组。

然而,危险的模式已经出现——这正是把它变成定时炸弹的根源。

目前没有任何不良后果。一切看起来都很正常。

⏳ 时间流逝…

一月到来。管理层决定是时候关闭这个视觉效果了。

“但别把它删了!明年我们还会需要!”

或者更早——春天来了,于是把雪花换成花瓣 🌸。

一个新任务进入积压。另一位开发者接手并思考:

“我不想每隔几个月都手动切换。让管理层自己控制——甚至让他们挑选图标。”

于是他们加入了配置。可能通过 CMS,可能通过远程接口。

🌐 “小小的改进”

function fetchSeasonalConfig() {
  return Promise.resolve({
    enabled: true,
    snowflake: "❄️"
  });
}

fetchSeasonalConfig().then(config => {
  if (!config.enabled) return;

  for (let i = 0; i "

就这样。你的应用里出现了完整的 XSS。

🤔 “但我用的是现代框架!”

有些人现在可能会这样想:

“得了吧,这只针对老旧的 jQuery 站点。我用的是现代框架——React / Angular / Vue——它们会帮我防御 XSS。”

事实恰恰相反。

⚠️ 框架只保护它们渲染的内容

React 和 Angular 默认会对内容进行转义——但仅限于它们的渲染系统内部

一旦你使用:

  • innerHTML
  • dangerouslySetInnerHTML(React)
  • [innerHTML]bypassSecurityTrustHtml(Angular)
  • 在框架之外运行的普通 JS 脚本

……你就自行承担风险。

而且你知道吗?那个雪花脚本往往位于框架之外的 index.html 中,作为“一个小的视觉效果”加载。框架并不会对随机的 JavaScript 文件进行沙箱隔离。

✅ 这件事本可以有不同的结局

All of this could have been avoided with one simple change:

el.textContent = snowflake;

Or by:

  • 明确创建 DOM 节点,而不是注入 HTML
  • 使用像 DOMPurify 这样的维护良好的库对 HTML 进行消毒(正确配置,并使用严格的白名单)
  • 明确定义安全边界:所有外部内容均视为不可信
  • 将“细小的 UI 功能”视作核心功能一样,采用相同的安全思维

Content Security Policy (CSP) 这样的深度防御措施也能降低影响——但它们并不能修复不安全的 DOM API。

🎄 最终思考

这件事真的发生了吗?
没有 😉

我听过很多非常相似的案例吗?
当然。

记住:没有任何功能太小,可以省略适当的代码审查和安全测试。
细节中藏着魔鬼。

🎁 节日快乐

祝你拥有快乐而宁静的假期——只要在网络上复制内容时稍微多一点谨慎,你就可以为自己创造这样的假期。 ❄️✨

Back to Blog

相关文章

阅读更多 »

仓库利用的权威指南

引言 仓库本质上只是一个 3‑D 盒子。利用率只是衡量你实际使用了该盒子多少的指标。虽然物流 c...