快速定位HTML中用户输入反射点需重点检查服务端模板渲染处(如PHP的echo $_GET['q'])、所有变量插值语法(${.*?}、{{.*?}})、innerHTML等DOM写入操作,以及<script>内联块、<meta>、<title>等易被注入的标签位置,同时警惕注释中残留的可执行代码。

怎么快速定位 HTML 中的用户输入反射点
HTML 源码里最危险的不是写了什么,而是“哪里把用户给的东西原样塞进去了”。常见反射位置包括 <title>、<meta name="description">、<script> 内联块、<div id="user-input"> 这类动态 ID 或 class 名。重点查服务端模板渲染处:比如 PHP 的 echo $_GET['q']、Node.js 的 res.send(`<title>${q}</title>`)、Python Flask 的 {{ request.args.get('q') }}。
容易踩的坑:
– 把 URL 参数名当安全标识(如 q 看起来像搜索词就忽略审查);
– 忽略大小写或编码绕过(%3Cscript%3E 仍能解码执行);
– 混淆 HTML 属性上下文和文本上下文(<input value="<script>"></input> 和 <div><script></div> 需要不同转义方式)。
为什么直接搜索 <script> 和 onerror= 不够用
静态搜标签或事件处理器会漏掉大量高危模式。比如:
– <img src=x onerror=alert(1)> 被 WAF 过滤后可能变成 <img src=x oneRrOr=alert(1)>;
– 模板引擎中拼接的 JS 字符串:var name = "${name}";,这里 " 闭合失败就会逃逸;
– <meta http-equiv="refresh" content="0;url=${url}"> 可触发任意跳转;
– <a href="${link}"> 若未校验协议白名单(如只允许 https://),可能变成 javascript:alert(1) 或 data:text/html,...。
真正该搜的是:
– 所有带变量插值的 HTML 片段(${.*?}、{{.*?}}、<%=.*?%>);
– 所有拼接字符串生成 HTML 的函数调用(innerHTML =、document.write(、$.html();
– 所有响应头写入点(setHeader(、addHeader(、response.setHeader(),防 CRLF 注入。
立即学习“前端免费学习笔记(深入)”;
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
审查 <script> 块内用户数据时的关键判断点
内联 <script> 是 XSS 高发区,但很多人只看是否用了 eval()。更隐蔽的是 JSON 数据注入:
– <script>var config = <%= JSON.stringify(userConfig) %>;</script>:若 userConfig 含未转义的 </script>,会提前闭合标签;
– <script>var name = "<%= name %>";</script>:若 name 是 ");alert(1);//,JS 语法被破坏;
– 使用 JSON.stringify() 不能代替上下文编码,它只保证 JSON 合法,不防 HTML 解析。
实操建议:
– 检查所有从服务端注入到 JS 上下文的变量,确认是否经过双重编码(先 JSON 编码,再 HTML 实体编码);
– 避免在 <script> 中直接拼接用户数据,优先用 data 属性 + JS 读取;
– 若必须内联,确保模板引擎支持 context-aware escaping(如 Nunjucks 的 |safe 要慎用,|escape 是默认且必要的)。
CDN 引入的第三方脚本如何纳入源码审查范围
很多人只审自己写的代码,却放任 <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script> 这类引入。问题在于:
– CDN 域名若被劫持或投毒(如 jsdelivr 曾因配置错误暴露内部路径),可导致任意代码执行;
– 版本号写死(如 @2.6.14)意味着不会自动修复已知漏洞(CVE-2021-28169 就影响 Vue 2.6.x 多个子版本);
– 缺少 SRI(Subresource Integrity)校验,无法验证资源完整性。
必须做的三件事:
– 用 npx depcheck 或 npm audit --audit-level high 扫描所有依赖,包括 CDN 引入的库(需先本地化或用 srihash.org 查哈希);
– 所有外部 <script> 标签必须带 integrity 和 crossorigin 属性;
– 对长期未更新的库(如 jQuery 1.x、Bootstrap 3.x),标记为“待替换”,不要仅靠 CSP 一堵了之——CSP 挡不住合法域名下的恶意变更。
真实审查中最容易被忽略的,是那些“看起来没用”的注释块和废弃模板片段。攻击者常利用 <!-- old code: <script>...</script> --> 中残留的可执行内容,或未删净的调试输出逻辑(如 <div style="display:none"><%= debugInfo %></div>)。它们不在主流程里,却保留在生产 HTML 源码中,成了沉默的入口。


















