FlawOpen

flawopen.com/JavaScript 中的 XSS/Svelte

Svelte 默认能防止 XSS 吗?

参考页面
通俗解释

把 `{comment}` 想成打印一张便条:尖括号会作为可见文本保留下来。`{@html comment}` 则像是要求排版人员把页面上的符号当作版式指令。如果这些符号来自不可信来源,浏览器可能会将其解析为 HTML 并造成 XSS。

有风险
<p>{@html comment}</p>
// 该值会被解析为实际 HTML 标记
安全
<p>{comment}</p>
// 自动转义

规则

Svelte 会将普通的 {expression} 输出编译为经过转义的文本,因此该值不会被解析为 HTML 标记。相反,{@html} 会有意渲染 HTML 字符串。Svelte 文档警告,为防止 XSS,必须转义该值或确保其来源受控。应将此指令视为安全敏感的 HTML 插入点;若需展示用户编写的富文本,请使用持续维护的清理器。

如何检查代码库

在 `.svelte` 文件中搜索 `{@html}`。对每个匹配项,追踪值的来源及其经过的所有转换。将用户输入、外部数据和存储的用户内容视为不可信。如果内容应作为文本显示,请使用 `{expression}`。如果确实需要富 HTML,请使用持续维护的 HTML 清理器,并测试其是否移除了不允许的标记。

grep -rn "{@html" --include="*.svelte" .

富文本 HTML:保持净化边界

如果内容应作为文本显示,请使用 `{expression}`。如果用户必须能够编写 HTML,请在传给 `{@html}` 之前,使用持续维护的 HTML 净化器(例如 DOMPurify)处理最终内容。净化后不要再拼接或修改结果,否则可能使保护失效。及时更新净化器,并仅允许产品所需的标记元素和属性。HTML 净化不会让同一个值在 JavaScript、CSS 或 URL 上下文中也变得安全。

参考资料

另请参阅 XSS 跨站脚本攻击(CWE-79):原理与各编程语言的防护方法 — flawopen.com 上传 SVG 有 XSS 风险吗? Vue v-html 的 XSS 风险 WKWebView loadHTMLString 能安全显示不可信内容吗? 反射型、存储型与 DOM 型 XSS 有何区别? Android addJavascriptInterface 的安全风险 Angular XSS 防护:安全默认行为与绕过 API