面试题答案
一键面试防止SQL注入的方法
- 使用预编译语句(PreparedStatement):
- 原理:预编译语句会将SQL语句先进行编译,然后再将参数传入,这样数据库不会将参数部分当作SQL语句的一部分进行解析,从而有效防止SQL注入。
- 输入验证和过滤:
- 原理:对用户输入的数据进行严格的验证和过滤,只允许符合特定格式的数据通过,比如验证是否为数字、日期等正确格式,过滤掉特殊字符等。但这种方法相对薄弱,因为很难完全覆盖所有可能的恶意输入,所以通常和预编译语句结合使用。
具体实现方式 - 使用PreparedStatement
示例代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SQLInjectionPreventionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "password";
String input = "test'; DROP TABLE users; --";// 模拟恶意输入
try (Connection connection = DriverManager.getConnection(url, username, password)) {
// 使用预编译语句
String sql = "SELECT * FROM users WHERE username =?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, input);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
System.out.println(resultSet.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在上述代码中,PreparedStatement
会将input
作为普通字符串参数处理,而不会将其当作SQL语句的一部分执行,从而防止了SQL注入。