MST

星途 面试题库

面试题:Java应用安全中如何防止SQL注入

在Java应用开发中,SQL注入是一种常见的安全威胁。请阐述在使用JDBC操作数据库时,如何有效防止SQL注入,并举出至少一种具体的实现方式及示例代码。
28.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

防止SQL注入的方法

  1. 使用预编译语句(PreparedStatement)
    • 原理:预编译语句会将SQL语句先进行编译,然后再将参数传入,这样数据库不会将参数部分当作SQL语句的一部分进行解析,从而有效防止SQL注入。
  2. 输入验证和过滤
    • 原理:对用户输入的数据进行严格的验证和过滤,只允许符合特定格式的数据通过,比如验证是否为数字、日期等正确格式,过滤掉特殊字符等。但这种方法相对薄弱,因为很难完全覆盖所有可能的恶意输入,所以通常和预编译语句结合使用。

具体实现方式 - 使用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注入。