html注入漏洞绝大多数是xss,核心在于用户输入未转义即拼入html上下文;需重点检查innerhtml、v-html、dangerouslysetinnerhtml等放弃转义的操作,以及title、meta、script等易忽略位置,并按输出上下文(html/js/css/属性)实施精准编码或净化。

HTML页面中的注入漏洞,绝大多数是XSS(跨站脚本),不是“有没有漏洞”,而是“哪里漏了、怎么漏的”。只要用户输入被不加隔离地拼进HTML输出,就极大概率存在可利用路径。
检查所有动态插入HTML的位置
浏览器只认最终渲染出的DOM,不管你是用模板引擎、JS拼接还是服务端渲染。关键看「用户输入是否以未转义方式进入HTML上下文」。
- 搜索代码中所有
innerHTML、document.write()、insertAdjacentHTML()调用,确认右侧值是否含用户输入(如URL参数、表单字段、API返回字段) - 检查模板语法:Jinja2的
{{ value|safe }}、Django的{{ value|safe }}、EJS的、Vue的v-html、React的dangerouslySetInnerHTML—— 这些都是显式放弃转义的信号,必须验证左侧数据100%可信 - 特别注意
<title></title>、<meta name="description">、<script></script>内联块、<style></style>中的动态内容 —— 这些位置常被忽略,但反射型XSS高发
验证输出编码是否匹配上下文
HTML实体编码( → <code><)只防HTML标签注入,对JS上下文或CSS上下文完全无效。同一段用户输入,可能在不同位置需要不同处理方式。
- 插入到HTML标签之间(如
<div>${userInput}</div>)→ 用HTML编码(htmlspecialchars()/textContent) - 插入到HTML属性中(如
<input value="${userInput}">)→ 必须先HTML编码,再确保引号闭合(避免截断属性) - 插入到内联
<script></script>中(如var name = "${userInput}";)→ 必须JS字符串编码(\x3c或 JSON.stringify),不能只做HTML编码 - 插入到
href或src属性(如<a href="%24%7BuserInput%7D"></a>)→ 必须校验协议白名单(仅允许http:、https:、/),并过滤javascript:、data:等危险伪协议
排查模板引擎是否执行用户输入
模板注入(SSTI)比XSS更严重,它能让攻击者执行任意服务端逻辑。判断依据不是“用了什么模板”,而是“用户输入是否参与了模板编译过程”。
- 查
template.compile(userInput)(art-template)、new Template(userInput)(FreeMarker)、render(templateStr + userInput)—— 这类调用等于把用户当程序员用 - 查
include/import指令是否拼接用户输入(如)→ 可能导致任意文件读取或目录遍历 - 查模板中是否启用危险函数:
?eval、?interpret(FreeMarker),{{@data}}、{{= data}}(art-template)→ 用户输入若传入这些函数,即触发执行 - FreeMarker配置中必须有
setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER),否则?api可绕过限制
别把CSP当消毒水,它只是最后一道闸
CSP(Content-Security-Policy)能缓解XSS后果,但无法阻止漏洞存在本身。很多团队配了 script-src 'self' 就以为万事大吉,结果 <img src="x" onerror="alert(1)"> 依然能弹窗、窃cookie、发起CSRF。
- CSP对事件处理器(
onerror、onclick)、javascript:伪协议、内联样式中的expression()(IE)等无效 - 真正有效的CSP需配合非空
default-src,禁用'unsafe-inline'和'unsafe-eval',并对img-src、connect-src等做最小化限定 - 如果业务必须用
v-html或dangerouslySetInnerHTML,CSP无法替代前端净化 —— 此时必须前置DOMPurify.sanitize(),且不能跳过
最常被忽略的一点:URL参数反射到HTML头部(如 <title>${q}</title>)和HTTP响应头(如 Location: /search?q=${q})属于同一类漏洞根因,只是表现层不同。修的时候得一起盯,不能只扫 里的DOM。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











