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 上下文中也变得安全。