mysql注入问题

在学习JDBC时,使用Statement接口会有如下SQL注入的漏洞.

由于没有对拼接的字符串进项检查,很容易遭受到恶意攻击,例如编程如下:
例如变成如下操作。
select * from user where username='aaa' or '1'='1' and password='bbb' or '1'='1';

解决SQL注入的漏洞的方法是使用PreparementStatement接口,以下是PreparementStatement接口的使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class PreparedStatmentTest {
@Test
public void testPreparedStatement() throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "abc123");
// 假设有一个User对象,需要将User中的信息保存到数据库中
User user = new User(null, "张飞", "123456", "zhangfei@sanguo.com");
//3.写sql语句
String sql = "select * from user where username = ? and password = ?";
//4.预编译sql
PreparedStatement pst = conn.prepareStatement(sql);
//5.填充占位符
pst.setString(1, user.getUsername());
pst.setString(2, user.getPassword());
//6.执行sql
ResultSet rs = pst.executeQuery();
System.out.println(rs.next());
//7.关闭资源
conn.close();
pst.close();
rs.close();
}
}