在 Web 开发中,“用户输入不可信” 是贯穿始终的安全铁律。但现实里,很多开发者仍会忽略最基础的输入过滤与输出转义,直接将用户提交的内容渲染到页面,这就给了XSS 跨站脚本攻击可乘之机。XSS 不仅是 OWASP Top 10 Web 漏洞常客,更是最常见、危害最隐蔽的安全风险之一。
一、什么是 XSS 跨站脚本?
XSS 全称 Cross-Site Scripting,为了和 CSS(层叠样式表)区分,简称为 XSS。它的核心原理是:攻击者在网页中注入恶意 JavaScript 代码,当其他用户访问页面时,代码自动执行,从而实现窃取信息、劫持会话、篡改页面等恶意操作。
而最常见、最易被忽视的触发场景,就是未过滤用户输入,直接输出到页面—— 服务器完全信任用户提交的内容,不做任何校验、过滤或转义,直接把用户输入原封不动渲染到 HTML 中。
二、未过滤用户输入:XSS 最直接的导火索
正常的 Web 流程是:用户输入→服务器校验过滤→安全输出到页面。而存在漏洞的流程是:用户输入→服务器直接存储 / 直接输出→恶意代码执行。
举个最简单的例子:很多网站的评论区、留言板、个人资料、搜索框,都会直接把用户输入的内容展示在页面上。如果后端代码类似这样(以伪代码示意):
plaintext
// 危险代码:直接获取用户输入并输出
user_input = request.getParameter("content");
response.write("<div>" + user_input + "</div>");
此时用户不输入正常文字,而是输入:
html
预览
<script>alert('XSS攻击成功')</script>
服务器不做任何处理,直接把这段代码输出到页面 HTML 中,浏览器解析时就会执行脚本,弹出提示框。这只是最简单的演示,真实攻击远比这危险。
三、XSS 攻击的真实危害:远不止弹个窗口
很多新手觉得 “只是弹框,没什么大不了”,但这只是验证漏洞的手段,真正的 XSS 攻击会造成严重后果:
- 窃取用户 Cookie 与会话恶意代码可读取页面 Cookie,发送到攻击者服务器,攻击者拿到会话凭证后,能直接登录用户账号,实现账号劫持。
- 篡改页面内容替换页面文字、图片、按钮,伪造登录框、诈骗信息,诱导用户输入账号密码。
- 劫持用户操作模拟点击、表单提交,在用户不知情的情况下进行转账、发帖、删帖等操作。
- 传播蠕虫病毒在社交平台、论坛中,恶意代码可自动转发、评论,短时间内大规模扩散。
- 收集隐私信息窃取用户浏览器信息、浏览记录、本地存储数据等敏感内容。
四、未过滤输入导致的 XSS 常见类型
基于 “未过滤用户输入” 这一核心漏洞,XSS 主要分为三类:
- **存储型 XSS(最危险)**恶意代码被存入服务器数据库,所有访问该页面的用户都会触发攻击,常见于评论、留言、个人资料。
- 反射型 XSS恶意代码放在 URL 参数中,用户点击构造好的链接后触发,常见于搜索框、跳转页面。
- DOM 型 XSS恶意代码直接修改前端 DOM 结构,不经过后端服务器,完全由前端未校验输入导致。
三者的本质共同点:用户输入未被过滤,直接成为页面 HTML/JS 的一部分。
五、如何从根源防御 XSS:别再直接输出用户输入
防御 XSS 没有复杂的黑科技,核心就是永远不信任用户输入,严格做输入过滤和输出转义。
1. 输出转义:最核心的防御手段
将用户输入中的特殊字符转换为 HTML 实体,让浏览器把它当作文本解析,而非代码:
<转换为<>转换为>"转换为"'转换为'&转换为&
主流框架(Vue、React、SpringBoot、Django 等)都自带自动转义功能,不要轻易关闭转义。
2. 严格校验用户输入
- 限制输入长度、格式(如手机号、邮箱只允许对应字符)
- 过滤
<script>、javascript:、onclick、onload等恶意关键字 - 只允许白名单字符,拒绝黑名单字符(白名单更安全)
3. 使用安全的渲染方式
- 前端使用
textContent而非innerHTML渲染用户输入 - 避免将用户输入直接拼接到 JavaScript 代码中
- 不使用
eval()、setTimeout()执行用户可控字符串
4. 启用安全策略
- 设置 HttpOnly Cookie,禁止 JS 读取会话 Cookie
- 启用 CSP(内容安全策略),限制页面可执行的脚本来源
六、结语:安全无小事,细节定成败
XSS 漏洞看似简单,却常年盘踞 Web 漏洞榜首,根源就是很多开发者抱有侥幸心理,觉得 “小项目不用做安全”“没人会攻击我的网站”。
未过滤用户输入,直接输出到页面,就是给攻击者留了一扇敞开的大门。
无论是个人博客、企业官网,还是电商、社交平台,都必须遵守 “用户输入不可信” 的原则,做好输入校验、输出转义、安全配置。只有把最基础的安全细节做到位,才能从根源杜绝 XSS 跨站脚本攻击,保护用户数据与网站安全。
安全开发,从过滤每一次用户输入开始。