)
你的代码能跑不等于你的代码安全——攻击者不需要通过功能测试,只需要找到一个漏洞。0x00 前言某大厂安全团队出品的《Java安全指南》是国内少有的、由大厂安全团队公开的编码规范。这份指南覆盖 Android + 后台两大场景,包含42条安全规则,每条都有 Bad/Good 代码对比,直接可用。本文从中精选最常见、最危险、最容易被忽视的 10 大安全陷阱,结合实际代码逐条解读。无论你是 CRUD 男孩还是架构师,这些坑你一定踩过。陷阱一:SQL 注入——还在用字符串拼接 SQL?危险等级:🔴 严重 |规则等级:【必须】SQL 注入是 OWASP Top 10 常客,但在 2026 年的今天,仍然有大量项目在用字符串拼接 SQL。❌ 错误写法// JDBC - 直接拼接外部输入Stringsql="SELECT * FROM users WHERE name = '"+custname+"'";Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);// MyBatis - 用 ${} 拼接select id="getApp"resultType="App"SELECT*FROMappWHEREapplication_id=${applicationId}/select为什么危险?攻击者输入1' OR '1'='1,SQL 变成:SELECT*FROMusersWHEREname='1'OR'1'='1'-- 返回所有用户数据!更狠的:1'; DROP TABLE users; --✅ 正确写法// JDBC - 使用 PreparedStatement + 占位符Stringsql="SELECT * FROM users WHERE name = ?";PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setString(1,custname);// 参数化绑定ResultSetrs=pstmt.executeQuery();// MyBatis - 用 #{} 绑定参数select id="getApp"resultType="App"SELECT*FROMappWHEREapplication_id=#{applicationId}/select⚠️ 特殊情况:ORDER BY / GROUP BYORDER BY后面不能用占位符(列名不是值),必须白名单校验:// 白名单过滤排序字段和方向String[]allowedColumns={"name","salary","created_at"};Stringcolumn=request.getParameter("sort");if(!Arrays.asList(allowedColumns).contains(column)){thrownewIllegalArgumentException("Invalid sort column");}// 排序方向只允许 ASC / DESCStringorder="ASC".equalsIgnoreCase(request.getParameter("order"))?"ASC":"DESC";Stringsql="SELECT * FROM users ORDER BY "+column+" "+order;陷阱二:XXE——XML 解析器默认不安全危险等级:🔴 严重 |规则等级:【必须】很多 Java 应用在解析 XML 时,默认开启了 DTD 和外部实体支持,导致 XXE(XML 外部实体注入)。❌ 错误写法DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();DocumentBuilderdb=dbf.newDocumentBuilder();Documentdoc=db.parse(inputStream);// 默认允许 DTD 和外部实体!攻击者提交:?xml version="1.0"?!DOCTYPEfoo[!ENTITY xxe SYSTEM "file:///etc/passwd"]userxxe;/user服务端会读取/etc/passwd的内容并返回!✅ 正确写法DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();// 关键:禁止 DTD 声明dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);// 禁用外部通用实体dbf.setFeature("http://xml.org/sax/features/external-general-entities",false);// 禁用外部参数实体dbf