在 Java + SQL 场景中,防止 SQL 注入的核心原则是:
永远不要把用户输入直接拼接到 SQL 语句中。
下面按常见做法从最推荐到补充方案说明。
' OR 1=1 -- 也不会改变 SQL 逻辑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 注入最根本、最有效的方法
#{} 而不是 ${}✅ 正确(防注入):
SELECT * FROM user WHERE id = #{id}
❌ 错误(有注入风险):
SELECT * FROM user WHERE id = ${id}
${}只用于非用户输入(如表名、排序字段,且需白名单)
@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 / saDROP、FILE 等危险权限即使发生注入,也能减少危害。
❌ 字符串拼接 SQL
String sql = "SELECT * FROM user WHERE name = '" + name + "'";
Statement st = conn.createStatement();
st.executeQuery(sql);
❌ MyBatis 中乱用 ${}
❌ 前端校验代替后端校验
防止 Java SQL 注入 = PreparedStatement + ORM 正确使用 + 输入校验 + 最小权限
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。