温馨提示×

温馨提示×

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

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

java JDBC怎么防止注入

发布时间:2026-10-22 19:14:57 来源:亿速云 阅读:81 作者:小樊 栏目:编程语言

在 Java 中使用 JDBC 防止 SQL 注入,核心原则是:永远不要把用户输入直接拼接到 SQL 语句中,而是使用 PreparedStatement(预编译语句)。


一、❌ 错误示例(容易被注入)

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

如果用户输入:

' OR '1'='1

最终 SQL 变成:

SELECT * FROM user WHERE username = '' OR '1'='1'

会导致绕过登录、泄露数据。


二、✅ 正确做法:使用 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();

为什么安全?

  • ? 是占位符
  • JDBC 会把参数作为数据,而不是 SQL 代码
  • 即使用户输入 ' OR '1'='1,也会被当成普通字符串

三、PreparedStatement 常用方法

ps.setInt(1, id);
ps.setString(2, name);
ps.setDouble(3, price);
ps.setDate(4, new Date(System.currentTimeMillis()));

四、其他防止 SQL 注入的补充措施

1️⃣ 永远不要拼接 SQL

❌ 不要:

"DELETE FROM user WHERE id = " + id

✅ 要:

"DELETE FROM user WHERE id = ?"

2️⃣ 使用 ORM 框架(更安全)

  • MyBatis(使用 #{} 而不是 ${})
  • Hibernate / JPA
  • Spring Data JPA

⚠️ MyBatis 注意:

<!-- 安全 -->
SELECT * FROM user WHERE id = #{id}

<!-- 危险(字符串拼接) -->
SELECT * FROM user WHERE id = ${id}

3️⃣ 最小权限原则

  • 数据库账户不要使用 root
  • 只给应用需要的权限(SELECT / INSERT 等)

4️⃣ 输入校验(辅助,不是主要手段)

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

五、总结一句话 ✅

JDBC 防止 SQL 注入 = PreparedStatement + 占位符 + 不拼接 SQL

如果你愿意,我也可以给你:

  • Spring Boot + JDBC 示例
  • MyBatis 防注入示例
  • SQL 注入真实攻击案例讲解
向AI问一下细节

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

AI
助
手