【JDBC】笔记(2)-[通俗易懂]

【JDBC】笔记(2)-[通俗易懂]1、需求:模拟用户登录功能的实现;2、业务描述:程序运行的时候,提供输入的入口,可以让用户输入用户名和密码;用户输入用户名和密码后,提交信息,java程序收集到用户信息…..

【JDBC】笔记(2)-

一.实现功能:

    1、需求:
        模拟用户登录功能的实现
    2、业务描述:
        程序运行的时候,提供输入的入口,可以让用户输入用户名和密码
        用户输入用户名和密码后,提交信息,java程序收集到用户信息
        java程序连接数据库验证用户名和密码是否合法,并显示结果(登录成功/登录失败)
    3、用户信息表
    +—-+———–+———-+———-+
    | id | loginName | loginPwd | realName |
    +—-+———–+———-+———-+
    |  1 | abc       | 123      | 张三     |
    |  2 | wwe       | 456      | 李四     |
    +—-+———–+———-+———-+

 

二.代码实现:

import java.sql.*;
import java.util.*;

/*
实现功能:
    1、需求:
        模拟用户登录功能的实现
    2、业务描述:
        程序运行的时候,提供输入的入口,可以让用户输入用户名和密码
        用户输入用户名和密码后,提交信息,java程序收集到用户信息
        java程序连接数据库验证用户名和密码是否合法,并显示.结果(登录成功/登录失败)
    3、用户信息表
    +----+-----------+----------+----------+
    | id | loginName | loginPwd | realName |
    +----+-----------+----------+----------+
    |  1 | abc       | 123      | 张三     |
    |  2 | wwe       | 456      | 李四     |
    +----+-----------+----------+----------+

 */
public class JDBCTest01 {
    public static void main(String[] args) {
        //初始化界面(用户输入账号和密码)
        Map<String,String> userLoginInfo = initUI();
        //验证用户名和密码(JDBC)
        boolean loginSuccess = login(userLoginInfo);
        //显示结果:
        System.out.println(loginSuccess==true?"登录成功":"登录失败");
    }

    /**
     * 验证用户登录信息是否正确
     * @param userLoginInfo 用户登录信息
     * @return false 表示登录失败,true 表示登录成功
     */
    private static boolean login(Map<String, String> userLoginInfo) {
        //打标记(登录结果)
        boolean loginSuccess = false;

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2、获取连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode",
                    "root","888");
            //3、获取数据库操作对象
            statement = connection.createStatement();
            //4、执行sql
            String sql = "select * from t_user where loginName = ""+userLoginInfo.get("loginName")+""" +
                    " and loginPwd = ""+userLoginInfo.get("loginPwd")+"" ";
            resultSet = statement.executeQuery(sql);
            //5、处理结果集
            //不需要while结果集,因为查询结果不是 无 就是 1条记录
            if (resultSet.next()){
                loginSuccess = true;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //从小到大分别关闭三个资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        //最后返回 登录结果(boolean)
        return loginSuccess;
    }

    /**
     * 初始化用户界面
     * @return 用户的用户名和密码(Map)
     */
    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();

        //用 HashMap(键值对的方式)存储用户输入的 账号和密码
        Map<String,String> userLoginInfo = new HashMap<>();
        userLoginInfo.put("loginName",loginName);
        userLoginInfo.put("loginPwd",loginPwd);

        return userLoginInfo;
    }
}
 

 

三.效果展示:

1.输入合法的用户名和密码:

点击查看
用户名:
abc
密码:
123
登录成功

Process finished with exit code 0
点击查看
用户名:
wwe
密码:
456
登录成功

Process finished with exit code 0

2.输入不合法的用户名和密码:

点击查看
用户名:
hahaha
密码:
123
登录失败

Process finished with exit code 0
 

 

四.SQL注入现象:

1.用户为:任意字符

  密码为:任意字符” or “1”=”1

用户名:
yyds
密码:
yyds" or "1"="1
登录成功

Process finished with exit code 0

  当用户输入信息为这种情况时,也能登录成功,这种现象叫做 SQL注入现象;因为以上字符正好完成了sql语句的拼接,然后此(本不应该被编译的)sql语句被发送给DBMS,DBMS进行编译,这样正好把用户提供的”非法信息”编译进去,导致原sql语句的含义被扭曲了;

2.总结SQL注入的根本原因是:

用户输入的信息中含有sql语句的关键字,并且这些关键字参与sql语句的编译过程,导致sql语句的原意被扭曲,进而达到sql注入;

3.如何解决SQL注入问题? 

SQL注入问题根本在于”输入的非法信息”不应该被编译,所以只要让用户提供的信息不参与SQL语句的编译,就解决了问题,那么就必须使用 — java.sql.PreparedStatement;

4.java.sql.PreparedStatement:

PreparedStatement 接口继承了 java.sql.PreparedStatement;

PreparedStatement 属于预编译的数据库对象;

PreparedStatement 的原理是:预先对SQL语句的框架进行编译,然后再给SQL语句传值;

 

改进后的登录系统代码:【JDBC】笔记(3)— 提高用户登录功能的安全性 (javaSE+MySQL+JDBC)[ 应用 PreparedStatement ]

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5579.html

(0)
上一篇 2023-05-03
下一篇 2023-05-03

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注