Java 应用程序安全:初学者必知的十大漏洞
Java 仍然是构建企业级和 Web 应用程序最流行的编程语言之一。然而,与任何其他语言一样,它也容易受到攻击。对于初级开发者来说,理解安全基础知识不仅是一种良好的实践,更是一项基本技能。在本文中,我们将剖析 Java 应用程序中最常见的十大漏洞,提供代码示例,并解释如何保护您的项目。
1. SQL 注入
这是最古老、最危险的漏洞之一。当用户输入在未经过滤的情况下直接插入到 SQL 查询中时,就会发生此漏洞。
易受攻击的代码示例:
String query = "SELECT * FROM users WHERE username = '" + userInput + "'";Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(query);攻击者可以将类似 ' OR '1'='1 的值传入 userInput,这将返回表中的所有数据。
如何保护: 始终使用 PreparedStatement。
String query = "SELECT * FROM users WHERE username = ?";PreparedStatement pstmt = connection.prepareStatement(query);pstmt.setString(1, userInput);ResultSet rs = pstmt.executeQuery();2. 跨站脚本攻击 (XSS)
XSS 攻击允许将恶意脚本注入到网页中,然后在受害者的浏览器中执行。如果不对输出进行转义,Java Servlet 和 JSP 经常容易受到此漏洞的攻击。
易受攻击的代码示例:
out.println("<p>Hello, " + request.getParameter("name") + "</p>");如何保护: 转义 HTML 字符或使用现代模板引擎(例如,Thymeleaf 或搭配 JSTL 的 JSP)。
// 使用 Apache Commons Lang 库String safeInput = StringEscapeUtils.escapeHtml4(userInput);out.println("<p>Hello, " + safeInput + "</p>");3. 跨站请求伪造 (CSRF)
CSRF 会强制用户在已登录的站点上执行非预期的操作,例如转账或更改密码。
漏洞示例:
<img src="https://bank.com/transfer?amount=1000&to=hacker" />如何保护: 使用 CSRF 令牌。在 Spring Security 中,启用保护后会自动完成此操作。
// 在 Spring Security 中启用 CSRF 保护http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());4. 不安全的反序列化
Java 允许从字节流恢复对象。如果攻击者能够传入恶意的序列化对象,则可能导致任意代码执行。
易受攻击的代码示例:
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());Object obj = ois.readObject(); // 潜在的危险操作如何保护:
- 不要反序列化来自不可信来源的数据。
- 使用类白名单。
- 使用带验证的替代方案,如 JSON(Jackson/Gson)。
5. 依赖项漏洞
现代 Java 项目使用数十个第三方库(Maven, Gradle)。过时或存在漏洞的版本是导致安全漏洞的常见原因。
如何保护:
- 定期更新依赖项。
- 使用分析工具:OWASP Dependency-Check、Snyk、GitHub Dependabot。
- 在 CI/CD 管道中添加检查。
6. 不安全的身份验证和会话管理
弱