java sql注入案例
时间: 2023-07-12 11:51:02 浏览: 157
Java SQL注入是一种常见的安全漏洞,攻击者可以通过构造恶意的SQL语句,获取或修改数据库中的数据。下面是一个简单的Java SQL注入案例:
假设有一个使用JDBC连接数据库的Java程序,其中一个查询用户信息的方法如下:
```
public User getUser(String username, String password) throws SQLException {
String sql = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
Connection conn = DriverManager.getConnection(url, user, passwd);
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
User user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
return user;
} else {
return null;
}
}
```
这个方法接收一个用户名和密码参数,从数据库中查询对应的用户信息。但是,如果攻击者将恶意的SQL语句传递给该方法,就可以造成SQL注入攻击。例如,如果攻击者将用户名参数设置为:
```
john' OR '1'='1
```
则构成的SQL语句为:
```
SELECT * FROM users WHERE username='john' OR '1'='1' AND password='xxxxx'
```
这个SQL语句会返回所有用户的信息,因为'1'='1'永远为真。攻击者可以通过这种方式获取到所有用户的信息,甚至可以修改数据库中的数据。
为了防止SQL注入攻击,应该使用参数化查询,将用户输入的参数作为参数传递给SQL语句。修改上面的代码如下:
```
public User getUser(String username, String password) throws SQLException {
String sql = "SELECT * FROM users WHERE username=? AND password=?";
Connection conn = DriverManager.getConnection(url, user, passwd);
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
User user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
return user;
} else {
return null;
}
}
```
使用参数化查询后,即使攻击者传递恶意的用户名和密码,也不会造成SQL注入攻击。
阅读全文