【前言】
针对上一篇博客中,通过SQL语句漏洞进行注入攻击的案例,在本篇博客,我们就来学习一下,如何预防SQL注入攻击。
【思路】
使用 Statement 的一个子接口 PreparedStatement prepareStatement(String sql) ,来实现预防SQL注入
【代码】
public class JDBCDemo3 {
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/day07";
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url, username, password);
Scanner sc = new Scanner(System.in);
System.out.print("用户名:");
String user = sc.nextLine();
System.out.print("密码:");
String pass = sc.nextLine();
//执行SQL语句,数据表,查询用户名和密码,如果存在,登录成功,不存在登录失败
String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
//调用Connection接口的方法prepareStatement,获取PrepareStatement接口的实现类
//方法中参数,SQL语句中的参数全部采用问号占位符
PreparedStatement pst = con.prepareStatement(sql);
System.out.println(pst);
//调用pst对象set方法,设置问号占位符上的参数
pst.setObject(1, user);
pst.setObject(2, pass);
//调用方法,执行SQL,获取结果集
ResultSet rs = pst.executeQuery();
while(rs.next()){
System.out.println("登陆成功!");
System.out.println("您的用户名为:"+rs.getString("username")+" 您的密码为:"+rs.getString("password"));
}
rs.close();
pst.close();
con.close();
}
}
正常登陆:
进行SQL注入攻击:
因此,建议以后的登录校验中,使用Statement 的子接口prepareStatement,可以防止注入攻击。