ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

java实战:防止SQL注入常用方法及代码示例

2026/9/11 12:02:45 拓冰建站 浏览量
java实战:防止SQL注入常用方法及代码示例

本文将介绍几种在Java中防止SQL注入的常用方法,并提供详细的代码示例。我们将探讨使用预编译的SQL语句(Prepared Statements)、使用ORM框架、使用SQL模板引擎和参数化查询等方法。通过本文,可以了解到如何在Java应用程序中实施有效的安全措施,以防范SQL注入攻击。

一、使用预编译的SQL语句(Prepared Statements)

预编译的SQL语句是防止SQL注入的最有效方法之一。这种方法使用?作为参数占位符,并通过setXXX方法来绑定实际的输入值。这种方式可以确保输入值被正确地处理,从而避免了SQL注入攻击。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PreparedStatementExample {private static final String URL = "jdbc:mysql://localhost:3306/databasename";private static final String USER = "username";private static final String PASSWORD = "password";public void selectUserData(String userId) {String sql = "SELECT * FROM users WHERE id = ?";try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setInt(1, Integer.parseInt(userId));ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println("User ID: " + resultSet.getInt("id"));System.out.println("Username: " + resultSet.getString("username"));// 处理其他字段...}} catch (SQLException e) {e.printStackTrace();}}public static void main(String[] args) {PreparedStatementExample example = new PreparedStatementExample();example.selectUserData("1"); // 正常输入example.selectUserData("1' OR '1'='1"); // SQL注入尝试}
}

二、使用ORM框架

ORM(Object-Relational Mapping)框架如Hibernate、JPA等,提供了一种更高层次的数据库操作方式。这些框架通常内置了防止SQL注入的功能,因为它们使用参数化查询来执行SQL语句。

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class ORMExample {private static EntityManagerFactory entityManagerFactory;private static EntityManager entityManager;static {entityManagerFactory = Persistence.createEntityManagerFactory("your_pu");entityManager = entityManagerFactory.createEntityManager();}public void selectUserData(String userId) {String query = "SELECT u FROM users u WHERE u.id = :id";TypedQuery<User> query = entityManager.createQuery(query, User.class);query.setParameter("id", Integer.parseInt(userId));List<User> users = query.getResultList();for (User user : users) {System.out.println("User ID: " + user.getId());System.out.println("Username: " + user.getUsername());// 处理其他字段...}}public static void main(String[] args) {ORMExample example = new ORMExample();example.selectUserData("1"); // 正常输入example.selectUserData("1' OR '1'='1"); // SQL注入尝试}
}

三、使用SQL模板引擎和参数化查询

import org.apache.ibatis.jdbc.ScriptRunner;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
public class MyBatisExample {private static SqlSessionFactory sqlSessionFactory;static {sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();}public void selectUserData(String userId) {String sql = "SELECT * FROM users WHERE id = #{id}";try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUserById(Integer.parseInt(userId));System.out.println("User ID: " + user.getId());System.out.println("Username: " + user.getUsername());// 处理其他字段...}}public static void main(String[] args) {MyBatisExample example = new MyBatisExample();example.selectUserData("1"); // 正常输入example.selectUserData("1' OR '1'='1"); // SQL注入尝试}
}

在这个例子中,我们使用了MyBatis框架,它是一个流行的Java SQL映射框架。在MyBatis中,你可以使用#{parameter}语法来引用参数,MyBatis会自动为你处理参数的转义和引用。

四、总结

本文介绍了几种在Java中防止SQL注入的常用方法,并提供详细的代码示例。我们探讨了使用预编译的SQL语句、ORM框架、SQL模板引擎和参数化查询等方法。每种方法都有其优点和适用场景,但它们都能有效地防止SQL注入攻击。