温馨提示×

温馨提示×

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

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

Java SQL如何防止注入

发布时间:2026-10-10 17:47:07 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java + SQL 场景中,防止 SQL 注入的核心原则是:
永远不要把用户输入直接拼接到 SQL 语句中。

下面按常见做法从最推荐到补充方案说明。


一、最推荐:使用 PreparedStatement(预编译语句)

原理

  • SQL 结构与参数分离
  • 参数会被数据库当作“数据”而不是“SQL 代码”
  • 即使输入包含 ' OR 1=1 -- 也不会改变 SQL 逻辑

示例(JDBC)

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

✅ 这是防止 SQL 注入最根本、最有效的方法


二、使用 ORM 框架(自动防注入)

1. MyBatis

  • 使用 #{} 而不是 ${}

✅ 正确(防注入):

SELECT * FROM user WHERE id = #{id}

❌ 错误(有注入风险):

SELECT * FROM user WHERE id = ${id}

${} 只用于非用户输入(如表名、排序字段,且需白名单)


2. JPA / Hibernate

@Entity
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

JPA 底层使用 PreparedStatement,天然防注入。


三、输入校验(辅助手段,不能单独依赖)

示例

if (!username.matches("[a-zA-Z0-9_]{3,20}")) {
    throw new IllegalArgumentException("非法用户名");
}

适合:

  • 用户名
  • 手机号
  • 邮箱
  • 枚举值

❗ 注意:校验不能替代 PreparedStatement


四、最小权限原则(防御纵深)

  • 数据库账号只给必要权限
  • 不使用 root / sa
  • 禁止 DROP、FILE 等危险权限

即使发生注入,也能减少危害。


五、常见错误写法(一定要避免)

❌ 字符串拼接 SQL

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

❌ MyBatis 中乱用 ${}

❌ 前端校验代替后端校验


六、总结一句话

防止 Java SQL 注入 = PreparedStatement + ORM 正确使用 + 输入校验 + 最小权限

如果你愿意,我可以:

  • 帮你检查某段 Java / MyBatis 代码是否安全
  • 给你一个完整的防注入示例项目结构
  • 讲讲“order by 怎么防注入”这种特殊场景
向AI问一下细节

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

AI
助
手