Java程序实现用户登录,用户名和密码,数据库检查
演示被别人注入攻击
public class userdenglu {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//密码和用户名写死的情况下的注入攻击
//用户名和密码由用户输入
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "12345678";
Connection con = DriverManager.getConnection(url,username,password);
Statement stat = con.createStatement();
//执行SQL语句,数据表,查询用户名和密码,如果存在,登录成功,不存在登录失败
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
String sql = "select * from pass where uname = '"+user+"' and upassword = '"+pass+"'";
ResultSet rs = stat.executeQuery(sql);
/*while(rs.next()){
System.out.println(rs.getString("uname")+" "+rs.getString("upassword"));
}*/
if(rs.next()){
System.out.println("登录成功");
System.out.println(sql);
System.out.println(rs.getString("uname")+" "+rs.getString("upassword"));
}else{
System.out.println("用户名或者密码错误");
}
rs.close();
stat.close();
con.close();
}
}
当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:XXX’ OR ‘a’=’a时,则真正执行的代码变为:
SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
实例:
public class preparestatementdemo {
/*
* java程序实现用户登录,用户名和密码,数据库检查
* 防止注入攻击
* Statement接口实现类,作用执行SQL语句,返回结果集
* 有一个子接口PreparedStatement,其中在Connection类中有数据库连接对象的方法:
* PreparedStatement preparedStatement(String sql)
*
*/
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "12345678";
Connection con = DriverManager.getConnection(url,username,password);
//执行SQL语句,数据表,查询用户名和密码,如果存在,登录成功,不存在登录失败
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
String sql = "select * from pass where uname = ? and upassword = ?";
//调用Connection接口中的方法 PreparedStatement prepareStatement(String sql)
//方法中参数,SQL语句中的参数全部采用问号占位符
PreparedStatement pst = con.prepareStatement(sql);
//调用pst对象set方法,设置问号占位符上的参数
pst.setObject(1, user);
pst.setObject(2, pass);
//调用方法,执行SQL,获取结果集
ResultSet rs = pst.executeQuery();
/*while(rs.next()){
System.out.println(rs.getString("uname")+" "+rs.getString("upassword"));
}*/
if(rs.next()){
System.out.println("登录成功");
System.out.println(sql);
System.out.println(rs.getString("uname")+" "+rs.getString("upassword"));
}else{
System.out.println("用户名或者密码错误");
}
rs.close();
pst.close();
con.close();
}
}