如何在威胁建模中识别前端API的注入攻击风险?

沐岩酱~ 阅读 67

最近在做威胁建模时发现前端调用的API可能存在注入攻击风险,但不确定该怎么具体分析。比如用第三方富文本库上传图片时,后台返回的Markdown内容直接渲染到页面,虽然加了输入过滤,但测试时发现特殊字符能绕过。该从哪些角度切入做威胁建模?

尝试过用OWASP的威胁分类表,但不知道如何对应到具体代码场景。比如这个渲染流程需要标记哪些威胁类型?数据流分析应该关注哪些边界点?有没有什么工具能辅助前端的威胁建模工作?

我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
a'ゞ光远
先说结论:你这个场景的核心风险是“未转义的 Markdown 渲染 + 输入绕过过滤”,属于典型的 XSS + 逻辑注入混合风险,不能只靠后端过滤,前端也得兜底。

先从数据流拆边界点:
用户上传图片 → 后端解析为 Markdown → 返回给前端 → 前端直接插入 DOM(比如 innerHTML 或 v-html / dangerouslySetInnerHTML)→ 浏览器渲染。
这个流程里有两个关键边界点:后端返回数据的可信度边界、前端插入 DOM 的执行边界。

要做校验,不是“加过滤”,是“结构化处理”:
后端如果真要返回 Markdown,至少得做两件事:
第一,返回前用白名单方案解析,比如用 marked 库的 sanitize 选项,或者更彻底点直接用 DOMPurify 的服务端版(比如 Node 环境的 jsdom + DOMPurify)做节点剥离,只保留 img、p、strong 这类安全标签,把 script、onerror、javascript: 全干掉。
第二,返回的数据字段里别直接带可执行内容,比如别返回 这种,哪怕加了转义也容易漏——应该只允许返回图片 URL,前端拼接

前端这边更不能偷懒:
如果用了 Vue,别用 v-html 直接插 Markdown 内容;React 也别用 dangerouslySetInnerHTML,除非你先用 DOMPurify 清一遍。
推荐直接用 marked + DOMPurify 组合,前端渲染前走一遍 DOMPurify.sanitize(),哪怕后端已经处理过也再过一遍,毕竟传输链路不可信。

工具辅助的话,前端可以结合 Snyk 或 Dependabot 扫第三方库漏洞(比如 marked 低版本有 XSS 漏洞),本地开发用 Chrome 的 Security panel 看有没有内联脚本或异常事件监听。
威胁建模时直接标成 CWE-79(跨站脚本)+ CWE-116(不正确转义)+ CWE-94(代码注入),再配合 STRIDE 分类:
- T:Tampering(篡改 Markdown 内容)
- S:Spoofing(伪造图片 URL 指向恶意站点)
- I:Information Disclosure(XSS 导致 cookie 或 token 泄露)

最后提醒一句:富文本上传本身风险就高,能不用就别用,实在要用也得走沙箱隔离(比如用 iframe + sandbox 属性),别图省事把整个 Markdown 当 HTML 直接插。
点赞 8
2026-02-24 12:00
上官紫瑶
我的做法是从数据流和渲染环节入手分析这类问题。你提到的富文本上传后返回Markdown内容直接渲染,这个流程里要特别注意三个环节:上传时的文件内容校验、后台返回的数据结构、前端渲染方式。

从威胁分类角度看,这个场景主要涉及A03:2021-Injection(注入)和A02:2021-Cryptographic Failures(加密失败)。上传环节可能被绕过的原因通常是只校验了文件后缀,没校验文件内容。建议在上传接口加个二次校验,比如用FileReader读取文件头几个字节判断真实类型。

渲染环节的注入风险往往出现在用了dangerouslySetInnerHTML或者Vue的v-html这种渲染方式。我一般会强制要求把所有用户内容经过DOMPurify过滤后再渲染,这个库可以过滤掉大部分恶意脚本。npm上就有包,安装后用起来很简单,比如:

import DOMPurify from 'dompurify'

const cleanContent = DOMPurify.sanitize(markdownContent)
// 然后再用innerHTML或者框架提供的方法渲染


数据流方面要重点关注三个边界点:前端往服务端传数据时、服务端处理完返回时、前端拿到数据渲染前。这三个环节都要加校验和过滤,不能只靠前端或者只靠后端。

工具方面我用过Microsoft的Threat Modeling Tool,它内置的STRIDE模型能帮助理清攻击面。如果是团队协作,还可以把发现的风险点直接标注在接口文档里,方便前后端一起配合防御。
点赞 7
2026-02-06 20:00