package com.bjpowernode.jdbc;import java.sql.*; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import java.util.Scanner; /*** 如果输入的用户名和密码是下面这样的,就会发生非注册人员登录的情况,叫做SQL注入现象* 用户名:asd* 密码:asd' or '1' = '1** 输入上面的用户名和密码以后会拼接出来下面的sql语句,为此会发生SQL注入现象* select * from t_user where login_name = 'asd' and login_pwd = 'asd' or '1' = '1' 因为这里的 1=1 恒成立** 这是发生在接收用户输入,接收一行的情况下: String loginName = s.nextLine();//接收一行的输入** 这是黑客使用的一种办法。** 导致SQL注入的根本原因是:用户不是一般的用户,用户是懂得程序的,他输入的用户名和密码信息中含有sql语句的关键字,这些信息* 与底层的sql语句进行了字符串的拼接,导致了原sql语句的含义被扭曲了。用户提供的信息参与了sql语* 句的编译。(这个程序是先进行字符串的拼接,然后再进行sql语句的编译,所以才会发生注入现象)*/ public class SQL注入现象 {public static void main(String[] args) {//初始化一个界面,让用户输入用户名和密码Map<String,String> userLoginInfo = initUI();//连接数据库验证用户名和密码是否正确boolean ok = checkNameAndPwd(userLoginInfo.get("loginName"),userLoginInfo.get("loginPwd"));System.out.println(ok ? "登录成功" : "登录失败");}/*** 验证用户名和密码* @param loginName 登录名* @param loginPwd 登录密码* @return true表示登录成功,false表示登录失败。*/private static boolean checkNameAndPwd(String loginName, String loginPwd) {ResourceBundle bundle = ResourceBundle.getBundle("resources\\db");String driver = bundle.getString("driver");String url = bundle.getString("url");String user = bundle.getString("user");String password = bundle.getString("password");boolean ok = false;//这里准备一个boolean类型的变量,默认是false表示登录失败Connection conn = null;Statement stmt = null;ResultSet rs = null;try {//1.注册驱动Class.forName(driver);//2.获取连接conn = DriverManager.getConnection(url,user,password);//3.获取数据库操作对象stmt = conn.createStatement();//4.执行SQLString sql = "select * from t_user where login_name = '" + loginName + "' and login_pwd = '" + loginPwd + "'";System.out.println(sql);rs = stmt.executeQuery(sql);//程序执行到这里,才会将以上的sql语句发送到DBMS上。DBMS进行sql语句的编译//5.处理查询结果集if (rs.next()){ok = true;}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {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 ok;}/*** 初始化界面,并接受用户的输入* @return 返回存储登录名和登录密码的Map集合*/private static Map<String, String> initUI() {System.out.println("欢迎使用本系统,请用户输入用户名和密码进行身份认证!");Scanner s = new Scanner(System.in);System.out.print("用户名:");String loginName = s.nextLine(); //s.nextLine()是一次接收一行的输入System.out.print("密码:");String loginPwd = s.nextLine();//将上面输入的用户名和密码放到Map集合中Map<String,String> userLoginInfo = new HashMap<>();userLoginInfo.put("loginName",loginName);userLoginInfo.put("loginPwd",loginPwd);//返回Map集合return userLoginInfo;} }
属性配置文件db.properties在IDEA目录中所处的位置
属性配置文件db.properties中的内容