实现功能:
1、需求:
模拟用户登录功能
2、业务描述:
程序运行时,提供一个输入的入口,可以让用户输入用户名和密码
用户输入用户名和密码之后,提交信息,java程序收集到用户信息
java程序连接数据库验证用户名和密码是否合法
合法显示登录成功
不合法:显示登录失败
3、数据的准备:
在实际开发中,表的设计会使用专业的建模工具,建模工具:PowerDesigner
使用PD工具进行数据库表的设计
代码如下:
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Demo01 {public static void main(String[] args) {//初始化界面Map<String,String> userLoginInfo = initUI();//验证用户名和密码boolean loginSuccess = login(userLoginInfo);//输出最终结果System.out.println(loginSuccess ? "登录成功!":"登录失败!");}/**** @param userLoginInfo 用户登录信息* @return false代表失败 true代表成功*/private static boolean login(Map<String, String> userLoginInfo) {//打标记boolean loginSuccess = false;//定义用户名密码的变量String loginName = userLoginInfo.get("loginName");String loginPwd = userLoginInfo.get("loginPwd");//JDBC代码Connection conn = null;Statement stmt = null;ResultSet rs = null;try {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","333");//3.获取数据库操作对象stmt = conn.createStatement();//4.执行SQL语句
// 语句1,将变量直接嵌入SQL语句中,或者定义变量
// String sql = "select * from t_user where loginName = '"+userLoginInfo.get("loginName")+"' and" +
// " loginPwd = '"+userLoginInfo.get("loginPwd")+"'";String sql = "select * from t_user where loginName = '"+loginName+"' and" + " loginPwd = '"+loginPwd+"'";//以上正好完成了sql语句的拼接,以下代码的含义是,发送sql语句给DBMS,DBMS进行sql编译//正好将用户提供的"非法信息"编译进去,导致了原来的SQL语句的含义被扭曲rs = stmt.executeQuery(sql);//5.处理结果集if(rs.next()){//登录成功loginSuccess = true;}} catch (Exception e) {e.printStackTrace();}finally {//6.释放资源if (rs != null){try {rs.close();}catch (SQLException e){e.printStackTrace();}}if (stmt != null){try {stmt.close();}catch (SQLException e){e.printStackTrace();}}if (conn != null){try {conn.close();}catch (SQLException e){e.printStackTrace();}}}return loginSuccess;}/** 初始化用户界面* @return 用户输入的用户名和密码等信息* */private static Map<String, String> initUI() {Scanner s = new Scanner(System.in);System.out.println("用户名:");String loginName = s.nextLine();System.out.println("密码:");String loginPwd = s.nextLine();Map<String,String > userLoginInfo = new HashMap<>();userLoginInfo.put("loginName",loginName);userLoginInfo.put("loginPwd",loginPwd);return userLoginInfo;}
}
4、当前程序存在的问题
用户名:fdda
密码:fdda ' or'1'='1
登录成功!
这种现象被称为SQL注入
5、导致sQL注入的根本原因是什么?
用户输入的信息中含有sq语句的关键字,并且这些关键字参与sql语句的编译过程
导致sq1语句的原意被扭曲,进而造成了sql注入。