在 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'
会导致绕过登录、泄露数据。
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();
? 是占位符' OR '1'='1,也会被当成普通字符串ps.setInt(1, id);
ps.setString(2, name);
ps.setDouble(3, price);
ps.setDate(4, new Date(System.currentTimeMillis()));
❌ 不要:
"DELETE FROM user WHERE id = " + id
✅ 要:
"DELETE FROM user WHERE id = ?"
#{} 而不是 ${})⚠️ MyBatis 注意:
<!-- 安全 -->
SELECT * FROM user WHERE id = #{id}
<!-- 危险(字符串拼接) -->
SELECT * FROM user WHERE id = ${id}
rootif (!username.matches("[a-zA-Z0-9_]{3,20}")) {
throw new IllegalArgumentException("非法用户名");
}
JDBC 防止 SQL 注入 = PreparedStatement + 占位符 + 不拼接 SQL
如果你愿意,我也可以给你:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。