一、前言跨站脚本攻击XSSCross-Site Scripting是OWASP TOP10 高频高危漏洞属于典型的代码注入类攻击。核心成因是Web 应用未对用户输入做严格校验、转义与过滤导致恶意脚本被嵌入页面并在受害者浏览器中执行。攻击者可利用 XSS 窃取用户隐私、劫持会话、篡改页面、钓鱼诱导、横向渗透几乎所有 Web 业务系统都存在暴露风险。本文系统性拆解反射型、存储型、DOM 型三类 XSS 核心区别、攻击场景、实战危害同时给出前端 后端双向落地防御方案用作大家的包括自己的面试复习。二、XSS 核心基础原理攻击者构造恶意 JS、HTML 标签、事件触发载荷目标网站接收未净化的用户输入直接拼接渲染到前端页面浏览器默认信任当前域名资源自动解析并执行恶意脚本恶意代码获取页面权限窃取 Cookie、本地存储、页面数据或执行越权操作。三、三大 XSS 攻击类型详解1. 反射型 XSS非持久型 / 一次性 XSS概述恶意载荷拼接在 URL 参数中用户点击恶意链接后服务端即时接收参数、直接反射返回页面脚本单次执行不落地存储。典型攻击场景搜索框回显、错误提示页、URL 参数展示、临时信息弹窗。简易攻击 Payloadhttp://test.com/search?keyscriptalert(document.cookie)/script核心特点无持久化仅单次请求生效依赖社工诱导点击恶意链接漏洞隐蔽性弱漏洞发现难度低危害范围仅限被诱导点击的单独用户。2. 存储型 XSS持久型 / 二次渲染 XSS核心原理恶意脚本提交至服务端写入数据库、评论区、公告、个人简介等持久化存储位置永久保存。任意用户访问对应页面时自动加载并执行恶意代码。典型攻击场景论坛评论、留言板、用户资料编辑、商品评价、后台公告发布。简易攻击 Payloadimg srcx οnerrοrstealCookie()核心特点持久化存储长期有效无需社工访问即触发危害范围广批量影响所有访问用户危害等级最高常作为内网渗透、批量盗号入口。3. DOM 型 XSS客户端自主渲染 XSS核心原理不经过服务端处理与存储完全由前端 JS 操作 DOM 节点直接解析用户可控参数并动态渲染恶意代码在前端本地触发。典型攻击场景前端 URL 哈希解析、路由跳转、本地拼接 DOM、前端无渲染过滤。简易攻击 Payloadhttp://test.com/#scriptalert(DOM XSS)/script四、XSS 通用实战危害隐私数据窃取读取用户 Cookie、Session、LocalStorage、表单敏感数据上传至攻击者服务器实现账号劫持。会话劫持与账号接管利用窃取的会话凭证免密登录受害者账号操作个人数据、发起越权请求。页面篡改与钓鱼欺诈修改页面文案、弹窗、跳转链接伪装官方页面诱导输入账号密码、手机号、验证码。浏览器持久化控制植入恶意爬虫、挖矿脚本、后台驻留代码长期监控用户浏览行为。内网横向拓展结合浏览器跨域漏洞、内网服务探测对内网资产进行扫描与渗透。五、前端防御方案禁用危险原生事件严格限制onerror、onload、onclick等事件标签过滤非常规属性。使用安全 DOM 操作 API禁止使用innerHTML、document.write危险方法优先使用textContent、setAttribute安全接口。前端输入内容转义对用户输入的特殊字符 做全局转义禁止直接拼接 HTML 片段。配置浏览器安全策略部署CSP 内容安全策略限制脚本加载域名、禁止内联脚本、禁止 eval 动态执行代码。Cookie 安全加固添加HttpOnly、Secure、SameSite属性禁止 JS 直接读取 Cookie阻断会话劫持核心链路。六、后端防御方案Java 开发emmm因为我是java开发统一输入过滤校验全局拦截特殊字符过滤script、iframe、javascript:等恶意标签与协议头。输出全局 HTML 编码页面渲染、接口返回数据前统一对特殊符号进行 HTML 实体转义破坏脚本执行结构。Java 核心工具类转义示例// 特殊字符转义防御XSS String safeText HtmlUtils.htmlEscape(userInput);入库前置净化评论、简介、留言等富文本内容入库前完成过滤编码避免存储型 XSS 持久化风险。接口参数白名单校验采用白名单机制校验参数格式严格限制输入长度、字符类型拒绝非法特殊字符。WAF 规则防护部署硬件 / 应用层 WAF拦截包含 XSS 特征的请求载荷作为边界兜底防护。七、企业级综合加固策略前后端双向联动输入过滤 输出编码 存储净化三层防护区分富文本场景编辑器内容采用白名单标签机制仅保留安全标签定期开展代码审计重点排查参数回显、DOM 拼接、内容发布类功能渗透测试常态化覆盖反射型、存储型、DOM 型全场景漏洞检测安全开发规范落地禁止开发人员直接拼接用户输入至 HTML 页面。