• 【JDBC】----综合案例(账号密码登录和SQL注入)


    分享第二十一篇励志语录

    .未来是美好的,但也许它只是跟今天一样,不一定有我们想要的一切。每一个今天,都是我们想要的全部世界,别把所有的希望和约定都寄放在明天,过好每一个今天,明天才会更有价值。 

     

    目录

    分享第二十一篇励志语录

     一:账号密码登录

    1 创建user表

    1.1、创建一张用户表user,表的字段如下:

    1.2、向user表中插入两条数据:

    2 实现登录

    二、SQL注入

    2.1 SQL注入的效果的演示

    2.1.1 SQL注入代码

    2.1.2 SQL注入效果

    2.2 什么是SQL注入

    2.3 如何避免SQL注入

    三:PrepareStatement解决SQL注入(重要)

    3.1 PreparedStatement的应用

    3.1.1 参数标记

    3.1.2 动态参数绑定

    3.2 综合案例


     

     一:账号密码登录

    1 创建user表

    1.1、创建一张用户表user,表的字段如下:

    id,用户编号,主键、自动增长。

    username,用户名,字符串类型、唯一、非空。

    password,密码,字符串类型、非空。

    phone,手机号码,字符串类型

     

    1.2、向user表中插入两条数据:

     

    2 实现登录

    需求:

    • 通过Scanner对象在控制台输入用户名和密码。

    • 将用户输入的用户名和密码作为条件,编写查询SQL语句。

    • 如果该用户存在,提示登录成功,反之提示登录失败。

    1. package cn.bdqn.demo02;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.sql.Statement;
    7. import java.util.Scanner;
    8. public class Login {
    9. public static void main(String[] args) throws ClassNotFoundException, SQLException {
    10. //创建Scanner类对象,从控制台获取用户名和密码数据
    11. Scanner sc = new Scanner(System.in);
    12. System.out.println("请输入用户名:");
    13. String user = sc.next();
    14. System.out.println("请输入密码:");
    15. String pwd = sc.next();
    16. //1、注册驱动
    17. Class.forName("com.mysql.jdbc.Driver");
    18. //2、获得连接对象
    19. String url = "jdbc:mysql://127.0.0.1:3306/java221804";
    20. String dbuser = "root";
    21. String password = "****";
    22. Connection connection = DriverManager.getConnection(url, dbuser, password);
    23. //3、获取发送SQL语句的对象
    24. Statement statement =connection.createStatement();
    25. //编写SQL语句
    26. String sql = "SELECT * FROM user WHERE username='"+user+"' AND password = '"+pwd+"';";
    27. //4、执行SQL语句
    28. // 当resultSet集合中有元素的时候,说明上面的sql语句查询到了结果,查询到了结果就说明你输入的用户名和密码在数据库中存在
    29. ResultSet resultSet=statement.executeQuery(sql);
    30. //5、处理结果:只要resultSet.next()方法的结果为true,说明ResultSet集合中有元素,从而说明查询到了你输入的用户名和密码
    31. if(resultSet.next()){
    32. System.out.println("用户名和密码正确,登录成功");
    33. }else{
    34. System.out.println("用户名或密码不正确,登录失败");
    35. }
    36. //6、关闭资源
    37. resultSet.close();
    38. statement.close();
    39. connection.close();
    40. sc.close();
    41. }
    42. }

     

    二、SQL注入

    2.1 SQL注入的效果的演示

    2.1.1 SQL注入代码

    1. package cn.bdqn.demo03;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.sql.Statement;
    7. import java.util.Scanner;
    8. public class Login {
    9. public static void main(String[] args) throws ClassNotFoundException, SQLException {
    10. //创建Scanner类对象,从控制台获取用户名和密码数据
    11. Scanner sc = new Scanner(System.in);
    12. System.out.println("请输入用户名:");
    13. String user = sc.nextLine();//使用nextLine()方法获取字符串
    14. System.out.println("请输入密码:");
    15. String pwd = sc.nextLine();//使用nextLine()方法获取字符串
    16. //1、注册驱动
    17. Class.forName("com.mysql.jdbc.Driver");
    18. //2、获取连接对象
    19. String url = "jdbc:mysql://127.0.0.1:3306/java221804";
    20. String dbuser = "root";
    21. String password = "****";
    22. Connection connection = DriverManager.getConnection(url, dbuser, password);
    23. //3、获取发送SQL语句的对象
    24. Statement statement =connection.createStatement();
    25. //编写SQL语句
    26. String sql = "SELECT * FROM user WHERE username='"+user+"' AND password = '"+pwd+"';";
    27. //4、执行SQL语句
    28. ResultSet resultSet=statement.executeQuery(sql);
    29. if(resultSet.next()){
    30. System.out.println("用户名和密码正确,登录成功");
    31. }else{
    32. System.out.println("用户名或密码不正确,登录失败");
    33. }
    34. //6、关闭资源
    35. resultSet.close();
    36. statement.close();
    37. connection.close();
    38. sc.close();
    39. }
    40. }

    2.1.2 SQL注入效果

    输入错误的用户名和密码,提示登录失败:

     

    输入错误的用户名和密码,提示登录成功:产生了SQL注入

     

    2.2 什么是SQL注入

    在用户输入的数据中有SQL关键字或语法,并且关键字或语法参与了SQL语句的编译。导致SQL语句编译后的条件为true,一直得到正确的结果。这种现象就是SQL注入。

    上面案例代码中,当你的用户名为 abc' or 1=1;# 密码为123,拼接到SQL语句中,变成如下效果:

    SELECT * FROM user WHERE username='abc' or 1=1;#' AND password = '123';

    此SQL语句or 后面1=1永远正确,#后面的成了注释,所以这条语句会将表中所有的数据查询出来,然后再做数据判断的时候,就会得到正确结果,从而说用户名和密码正确,登录成功

    2.3 如何避免SQL注入

    由于SQL注入产生的原因是在用户输入数据对SQL整合,整合后再发送到数据库进行编译产生的。所以为了避免SQL注入,就需要SQL语句在用户输入数据前就进行编译,成为完整的SQL语句,编译完成后再进行数据填充。这个操作需要使用PrepareStatement实现。

    三:PrepareStatement解决SQL注入(重要)

     

    PreparedStatement接口继承了Statement接口,执行SQL语句的方法与Statement执行SQL语句的方法相同。

    3.1 PreparedStatement的应用

    PreparedStatement的作用:

    • 预编译SQL语句,效率高

    • 安全,避免SQL注入

    • 可以动态的填充数据,执行多个同结构的SQL语句

    3.1.1 参数标记

    //预编译SQL语句,SQL中的所有参数由?符号占位,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。
    String sql = "select * from user where userName = ? and password=?;";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);

    3.1.2 动态参数绑定

    preparedStatement.sexXxx(下标,值):参数下标从1开始,为指定参数下标绑定值。Xxx表示数据类型。

    //绑定参数,有多少个?绑定多少个参数值
    preparedStatement.setString(1, userName);
    preparedStatement.setString(2, pwd);

    3.2 综合案例

    1. package cn.bdqn.demo02;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.PreparedStatement;
    5. import java.sql.ResultSet;
    6. import java.sql.SQLException;
    7. import java.util.Scanner;
    8. public class PreparedStatementDemo01 {
    9. public static void main(String[] args) throws ClassNotFoundException,SQLException {
    10. Scanner sc = new Scanner(System.in);
    11. System.out.println("请输入用户名:");
    12. String userName = sc.nextLine();
    13. System.out.println("请输入密码:");
    14. String pwd = sc.nextLine();
    15. // 1、注册驱动
    16. Class.forName("com.mysql.jdbc.Driver");
    17. // 2、获得连接
    18. String url = "jdbc:mysql://localhost:3306/java2217";
    19. String user = "root";
    20. String password = "****";
    21. Connection connection = DriverManager.getConnection(url, user, password);
    22. // 3、获取发送SQL对象
    23. String sql = "select * from user where userName = ? and password=?;";
    24. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    25. // 4、绑定参数,有多少个?绑定多少个参数值
    26. preparedStatement.setString(1, userName);
    27. preparedStatement.setString(2, pwd);
    28. // 5、执行SQL语句,并处理结果
    29. ResultSet resultSet = preparedStatement.executeQuery();
    30. if (resultSet.next()) {
    31. System.out.println("用户名和密码正确,登录成功");
    32. } else {
    33. System.out.println("用户名或密码错误,登录失败");
    34. }
    35. // 6、释放资源:与关闭流的方式一样,先开的后关,后开的先关
    36. resultSet.close();
    37. preparedStatement.close();
    38. connection.close();
    39. sc.close();
    40. }
    41. }

     

    今天的分享就到此结束了

    创作不易点赞评论互关三连

     

     

  • 相关阅读:
    干货必看|Spring Boot整合MyBatis框架详解
    十分钟带你上手egg,写自己的后端接口
    【HMS core】【FAQ】典型问题合集7
    因子分析怎么计算权重?
    oracle 切换数据库类型报错
    阿里云Arthas使用——通过watch命令查看类的返回值 & 捞数据出来
    一图看懂华为云CodeArts Inspector 三大特性,带你玩转漏洞管理服务
    一文让你彻底搞懂AQS(通俗易懂的AQS)
    slint ui学习笔记
    LeetCode707:设计链表
  • 原文地址:https://blog.csdn.net/swy2560666141/article/details/128196481