温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java SQL如何防注入

发布时间:2026-09-01 08:22:15 来源:亿速云 阅读:102 作者:小樊 栏目:编程语言

在 Java 中使用 SQL 时,**防止 SQL 注入(SQL Injection)**的核心原则是:永远不要把用户输入直接拼接到 SQL 语句中。下面从最常见、最推荐到补充手段系统说明。


一、最推荐:使用 PreparedStatement(必须掌握)

✅ 正确做法(参数化查询)

String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();

❌ 错误做法(拼接 SQL,极易注入)

String sql = "SELECT * FROM user WHERE username = '" + username + "'";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);

✅ PreparedStatement 会将参数作为数据处理,而不是 SQL 代码,从根本上防止注入。


二、使用 ORM 框架(更安全、更省心)

1️⃣ MyBatis

  • 使用 #{} ✅(安全,预编译)
SELECT * FROM user WHERE username = #{username}
  • 避免使用 ${} ❌(直接拼接,危险)

2️⃣ JPA / Hibernate

@Query("FROM User u WHERE u.username = :username")
List<User> findUser(@Param("username") String username);

✅ JPA 默认使用参数化查询。


三、输入校验(辅助手段,不是主力)

⚠️ 不能单独依赖,但有用:

  • 白名单校验(如只允许字母数字)
  • 长度限制
  • 正则校验
if (!username.matches("[a-zA-Z0-9_]{3,20}")) {
    throw new IllegalArgumentException("非法用户名");
}

四、最小权限原则(降低危害)

数据库账号应:

  • 不使用 root
  • 只给必要权限(如只用 SELECTUPDATE
  • 不同系统使用不同账号

五、存储过程(谨慎使用)

✅ 如果使用参数化调用:

CallableStatement cs = conn.prepareCall("{call getUser(?)}");
cs.setString(1, username);

❌ 存储过程内部拼接 SQL 仍然危险。


六、其他安全建议

  • 关闭数据库错误回显(避免泄露结构)
  • 使用 Web 防火墙(WAF)
  • 定期安全审计
  • 避免动态表名 / 字段名拼接

✅ 总结一句话

Java 防 SQL 注入 = PreparedStatement + 参数化 + ORM + 输入校验 + 最小权限

如果你用的是 Spring Boot / MyBatis / JPA,我可以给你对应的最佳实践示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI