Java语言可以使用PreparedStatement来防止SQL注入攻击,下面是一个示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SQLInjectionExample {
public static void main(String[] args) {
String username = "admin'; DROP TABLE users;--";
String password = "password123";
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// Establish database connection
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "username", "password");
// Create a prepared statement with parameterized query
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
statement = connection.prepareStatement(query);
// Set parameters
statement.setString(1, username);
statement.setString(2, password);
// Execute the query
resultSet = statement.executeQuery();
// Process the result set
if (resultSet.next()) {
System.out.println("Login successful");
} else {
System.out.println("Invalid username or password");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// Close resources
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在上面的代码中,我们使用PreparedStatement来创建一个带有参数的查询语句。在执行查询之前,我们使用setString
方法将参数添加到查询中。这样可以确保输入的值不会被解释为SQL代码。结果集中的数据可以用来验证用户的登录信息。
通过使用PreparedStatement,我们可以防止SQL注入攻击,因为输入的值将被视为字符串而不是代码的一部分。这样,即使用户通过输入恶意SQL代码,也不会对数据库造成任何损害。