1、可以注入攻击的登录
package pers.jdbc.log; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.*; public class Log { public static void main(String[] args) throws Exception { // 输入用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入账号"); String zh = sc.nextLine(); System.out.println("请输入密码"); String mm = sc.nextLine(); // 到数据库验证用户名和密码是否正确 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/student mangement system"; String username = "root"; String password = "root"; Connection con = DriverManager.getConnection(url, username, password); Statement state = con.createStatement(); String sql = "select * from Login where account='" + zh + "' and password='" + mm + "'"; ResultSet re = state.executeQuery(sql); // 输出:正确显示欢迎,不正确显示错误 if (re.next()) { System.out.println("登陆成功!"); } else { System.out.println("输入账号或密码错误"); } state.close(); con.close(); re.close(); } }
可以看出,在登陆的数据表中,并没有与之相对应的用户名和密码,但是也能登录成功。 其实在java代码中,运行的查询语句是这样的:select * from Login where account='zhai'and password='1' or 1=1,运行结果为true。
2、注入攻击的防止
package pers.jdbc.log; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Scanner; public class Log1 { public static void main(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/student mangement system"; String username = "root"; String password = "root"; Connection con = DriverManager.getConnection(url, username, password); Scanner sc = new Scanner(System.in); System.out.println("请输入账号"); String account = sc.nextLine(); System.out.println("请输入密码"); String password1 = sc.nextLine(); // 执行SQL语句,数据表,查询用户名和密码,如果存在,登录成功,不存在登录失败 String sql = "SELECT * FROM login WHERE account=? AND password=?"; // 调用Connection接口的方法prepareStatement,获取PrepareStatement接口的实现类 // 方法中参数,SQL语句中的参数全部采用问号占位符 PreparedStatement pst = con.prepareStatement(sql); // 调用p s t对象set方法,设置问号占位符上的参数 pst.setObject(1, account); pst.setObject(2, password1); // 调用方法,执行SQL,获取结果集 ResultSet rs = pst.executeQuery(); while (rs.next()) { System.out.println(rs.getString("account") + "欢迎你"); } rs.close(); pst.close(); con.close(); sc.close(); } }
在java代码中,如果还进行注入攻击,运行的查询语句是这样的:select * from Login where account='zhai'and password=1' or ‘1=1,将运行错误。