在 Java 中预防 SQL 注入,从零基础到精通,收藏这篇就够了!
.markdown-body pre,.markdown-body pre>code.hljs{color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}
在 Java 中预防 SQL 注入的核心是 避免直接拼接 SQL 语句,并通过参数化查询、ORM 框架和严格的输入验证来实现安全防护。以下是具体实践方法:
1. 强制使用 PreparedStatement(参数化查询)
原理:将 SQL 语句结构与用户输入数据分离,确保输入内容始终作为“数据”处理,而非可执行的代码。
正确示例:
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
try (Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, username); // 自动转义特殊字符(如 ' -> \')
pstmt.setString(2, password);
try (ResultSet rs = pstmt.executeQuery()) {
// 处理结果
}
}
错误做法(高危!):
// 直接拼接 SQL(存在注入风险!)
String sql = "SELECT * FROM users WHERE username = '" + username + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
2. 使用 ORM 框架(如 Hibernate/JPA)
ORM 框架会自动生成参数化查询,减少手写 SQL 的注入风险。
Hibernate 示例:
// 使用 Hibernate Criteria API
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);
query.where(
cb.equal(root.get("username"), username),
cb.equal(root.get("password"), password)
);
User user = session.createQuery(query).uniqueResult();
HQL 参数化:
String hql = "FROM User WHERE username = :username";
Query<User> query = session.createQuery(hql, User.class);
query.setParameter("username", username);
User user = query.uniqueResult();
3. 输入验证与过滤
白名单校验:
// 校验用户名是否符合规则(仅允许字母、数字、下划线)
if (!username.matches("^[a-zA-Z0-9_]{4,20}$")) {
throw new IllegalArgumentException("Invalid username");
}
转义特殊字符(备用方案):
如果必须拼接 SQL(如动态表名),需严格过滤:
// 使用 Apache Commons Text 转义
String safeInput = StringEscapeUtils.escapeSql(input); // 仅适用于简单场景,不推荐依赖!
4. 避免动态拼接 SQL
高危场景:动态表名、列名等无法通过 PreparedStatement 参数化。
安全做法:使用白名单校验合法值:
// 动态表名校验(只允许预定义的合法表名)
Set<String> validTables = Set.of("users", "products");
if (!validTables.contains(tableName)) {
throw new IllegalArgumentException("Invalid table name");
}
String sql = "SELECT * FROM " + tableName; // 此时拼接是安全的
5. 数据库配置与权限
-
最小权限原则:应用使用的数据库账号应仅拥有
SELECT、INSERT、UPDATE等必要权限,禁止DROP、GRANT等高危操作。 -
禁用敏感函数:如 MySQL 的
LOAD_FILE、INTO OUTFILE。
6. 其他安全措施
隐藏错误信息:
try {
// 执行数据库操作
} catch (SQLException e) {
// 生产环境返回通用错误,避免泄露细节
logger.error("Database error", e);
throw new RuntimeException("Internal server error");
}
使用安全工具:
-
OWASP ESAPI:提供安全的 SQL 转义方法。
-
SQL 注入扫描工具:集成
sqlmap或SonarQube进行代码审计。
总结:Java 防御 SQL 注入的核心规则
场景
安全做法
高风险做法(避免!)
执行 SQL 查询
使用 PreparedStatement 参数化
拼接字符串生成 SQL
动态表名/列名
白名单校验合法值
直接拼接用户输入
输入验证
正则表达式白名单过滤
仅在前端验证或不做验证
错误信息处理
记录日志,返回通用错误提示
返回详细数据库错误信息
ORM 框架
优先使用 Hibernate/JPA 的 Criteria 或 HQL
手动拼接 HQL 或 JPQL
关键点:
-
绝不信任用户输入:所有外部输入(包括 HTTP 请求参数、Cookie、Headers)均需验证和转义。
-
代码审查:定期检查项目中是否存在
Statement或字符串拼接 SQL 的代码。 -
依赖更新:确保数据库驱动和 ORM 框架保持最新版本,修复已知漏洞。
题外话
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的网安视频教程,之前都是内部资源,专业方面绝对可以秒杀国内99%的机构和个人教学!全网独一份,你不可能在网上找到这么专业的教程。
内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,200多G的资源,不用担心学不全。
因篇幅有限,仅展示部分资料,需要见下图即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

因篇幅有限,仅展示部分资料,需要见下图即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话见下图即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,需要见下图即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
更多推荐


所有评论(0)