ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table");
1. SQL 注入攻击:
使用字符串拼接构建 SQL 语句是一种不安全的做法,因为用户输入的数据可能包含恶意代码,导致 SQL 注入攻击。考虑以下情况:
String account = "admin'; DROP TABLE t_user; --";
String password = "somepassword";
String sql = "SELECT * FROM t_user WHERE account = '"+account+"' AND PASSWORD = "+password+"';";
在这个例子中,如果用户输入的 account
中包含 '; DROP TABLE t_user; --
,整个 SQL 语句会变成:
SELECT * FROM t_user WHERE account = 'admin'; DROP TABLE t_user; --' AND PASSWORD = somepassword;
这会导致额外的恶意 SQL 语句被执行,从而删除 t_user
表。
2. 代码可读性和维护性:
使用字符串拼接构建 SQL 语句降低了代码的可读性和维护性。在复杂的 SQL 查询中,拼接字符串可能会变得非常混乱,并且容易出错。此外,如果 SQL 查询结构发生变化,需要修改 SQL 语句,这样的修改可能会涉及到多处字符串拼接,增加了维护的难度。
安全的替代方案:
安全的替代方案是使用参数化查询(Prepared Statements)来构建 SQL 语句。具体来说,使用 PreparedStatement
对象,并通过设置参数值的方式来代替字符串拼接。
String account = "admin";
String password = "somepassword";
String sql = "SELECT * FROM t_user WHERE account = ? AND password = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, account);
preparedStatement.setString(2, password);
ResultSet resultSet = preparedStatement.executeQuery();
这种方式可以有效防止 SQL 注入攻击,并提高代码的可读性和可维护性。