XSS跨站脚本(未过滤用户输入,直接输出到页面)

0 阅读5分钟

在 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 攻击会造成严重后果:

  1. 窃取用户 Cookie 与会话恶意代码可读取页面 Cookie,发送到攻击者服务器,攻击者拿到会话凭证后,能直接登录用户账号,实现账号劫持。
  2. 篡改页面内容替换页面文字、图片、按钮,伪造登录框、诈骗信息,诱导用户输入账号密码。
  3. 劫持用户操作模拟点击、表单提交,在用户不知情的情况下进行转账、发帖、删帖等操作。
  4. 传播蠕虫病毒在社交平台、论坛中,恶意代码可自动转发、评论,短时间内大规模扩散。
  5. 收集隐私信息窃取用户浏览器信息、浏览记录、本地存储数据等敏感内容。

四、未过滤输入导致的 XSS 常见类型

基于 “未过滤用户输入” 这一核心漏洞,XSS 主要分为三类:

  1. **存储型 XSS(最危险)**恶意代码被存入服务器数据库,所有访问该页面的用户都会触发攻击,常见于评论、留言、个人资料。
  2. 反射型 XSS恶意代码放在 URL 参数中,用户点击构造好的链接后触发,常见于搜索框、跳转页面。
  3. DOM 型 XSS恶意代码直接修改前端 DOM 结构,不经过后端服务器,完全由前端未校验输入导致。

三者的本质共同点:用户输入未被过滤,直接成为页面 HTML/JS 的一部分

五、如何从根源防御 XSS:别再直接输出用户输入

防御 XSS 没有复杂的黑科技,核心就是永远不信任用户输入,严格做输入过滤和输出转义

1. 输出转义:最核心的防御手段

将用户输入中的特殊字符转换为 HTML 实体,让浏览器把它当作文本解析,而非代码:

  • < 转换为 &lt;
  • > 转换为 &gt;
  • " 转换为 &quot;
  • ' 转换为 &#x27;
  • & 转换为 &amp;

主流框架(Vue、React、SpringBoot、Django 等)都自带自动转义功能,不要轻易关闭转义

2. 严格校验用户输入

  • 限制输入长度、格式(如手机号、邮箱只允许对应字符)
  • 过滤 <script>javascript:onclickonload 等恶意关键字
  • 只允许白名单字符,拒绝黑名单字符(白名单更安全)

3. 使用安全的渲染方式

  • 前端使用 textContent 而非 innerHTML 渲染用户输入
  • 避免将用户输入直接拼接到 JavaScript 代码中
  • 不使用 eval()setTimeout() 执行用户可控字符串

4. 启用安全策略

  • 设置 HttpOnly Cookie,禁止 JS 读取会话 Cookie
  • 启用 CSP(内容安全策略),限制页面可执行的脚本来源

六、结语:安全无小事,细节定成败

XSS 漏洞看似简单,却常年盘踞 Web 漏洞榜首,根源就是很多开发者抱有侥幸心理,觉得 “小项目不用做安全”“没人会攻击我的网站”。

未过滤用户输入,直接输出到页面,就是给攻击者留了一扇敞开的大门。

无论是个人博客、企业官网,还是电商、社交平台,都必须遵守 “用户输入不可信” 的原则,做好输入校验、输出转义、安全配置。只有把最基础的安全细节做到位,才能从根源杜绝 XSS 跨站脚本攻击,保护用户数据与网站安全。

安全开发,从过滤每一次用户输入开始。