【愚公系列】2023年03月 Java教学课程 112-JDBC的(SQL注入和事务)

2023-04-01 11:35:58 浏览数 (2)

文章目录

      • 一、JDBC的SQL注入攻击
        • 1.sql注入攻击的演示
        • 2.sql注入攻击的原理
        • 3.PreparedStatement的介绍
        • 4.PreparedStatement的使用
      • 二、JDBC的事务管理
        • 1.service层
        • 2.dao层

一、JDBC的SQL注入攻击

1.sql注入攻击的演示
  • 在登录界面,输入一个错误的用户名或密码,也可以登录成功
代码语言:javascript复制
用户名:admin
密码:admin' or '1'=1
2.sql注入攻击的原理

SQL注入攻击是一种利用Web应用程序中存在的安全漏洞,向应用程序的数据库中插入恶意的SQL语句的攻击方式。攻击者通过在Web应用程序中输入特定的恶意代码,从而获得对数据库的访问权限,可以对数据库进行修改、删除或者获取敏感信息等操作。

SQL注入攻击的原理是利用Web应用程序在处理用户输入数据时没有对数据进行有效的过滤和验证,使得攻击者可以通过构造恶意的输入数据来欺骗应用程序执行恶意的SQL语句。攻击者可以通过在表单、URL参数、Cookie等输入框中输入恶意的SQL语句,从而绕过应用程序的身份验证和访问控制机制,进而获取敏感信息或者执行恶意操作。

SQL注入攻击是一种常见的Web安全漏洞,应用程序开发者需要注意对用户输入数据进行有效的过滤和验证,以避免此类攻击。

3.PreparedStatement的介绍
  • 预编译sql语句的执行者对象。在执行sql语句之前,将sql语句进行提前编译。明确sql语句的格式后,就不会改变了。剩余的内容都会认为是参数!参数使用?作为占位符
  • 为参数赋值的方法:setXxx(参数1,参数2);
    • 参数1:?的位置编号(编号从1开始)
    • 参数2:?的实际参数
  • 执行sql语句的方法
    • 执行insert、update、delete语句:int executeUpdate();
    • 执行select语句:ResultSet executeQuery();
4.PreparedStatement的使用
代码语言:javascript复制
/*
	 使用PreparedStatement的登录方法,解决注入攻击
*/
@Override
public User findByLoginNameAndPassword(String loginName, String password) {
    //定义必要信息
    Connection conn = null;
    PreparedStatement pstm = null;
    ResultSet rs = null;
    User user = null;
    try {
        //1.获取连接
        conn = JDBCUtils.getConnection();
        //2.创建操作SQL对象
        String sql = "SELECT * FROM user WHERE loginname=? AND password=?";
        pstm = conn.prepareStatement(sql);
        //3.设置参数
        pstm.setString(1,loginName);
        pstm.setString(2,password);
        System.out.println(sql);
        //4.执行sql语句,获取结果集
        rs = pstm.executeQuery();
        //5.获取结果集
        if (rs.next()) {
            //6.封装
            user = new User();
            user.setUid(rs.getString("uid"));
            user.setUcode(rs.getString("ucode"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
            user.setGender(rs.getString("gender"));
            user.setDutydate(rs.getDate("dutydate"));
            user.setBirthday(rs.getDate("birthday"));
            user.setLoginname(rs.getString("loginname"));
        }
        //7.返回
        return user;
    }catch (Exception e){
        throw new RuntimeException(e);
    }finally {
        JDBCUtils.close(conn,pstm,rs);
    }
}

二、JDBC的事务管理

1.service层
  • 接口
代码语言:javascript复制
/*
	 批量添加
*/
void batchAdd(List<User> users);
  • 实现类
代码语言:javascript复制
/*
      事务要控制在此处
*/
@Override
public void batchAdd(List<User> users) {
    //获取数据库连接
    Connection connection = JDBCUtils.getConnection();
    try {
        //开启事务
        connection.setAutoCommit(false);
        for (User user : users) {
            //1.创建ID,并把UUID中的-替换
            String uid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
            //2.给user的uid赋值
            user.setUid(uid);
            //3.生成员工编号
            user.setUcode(uid);

            //模拟异常
            //int n = 1 / 0;

            //4.保存
            userDao.save(connection,user);
        }
        //提交事务
        connection.commit();
    }catch (Exception e){
        try {
            //回滚事务
            connection.rollback();
        }catch (Exception ex){
            ex.printStackTrace();
        }
        e.printStackTrace();
    }finally {
        JDBCUtils.close(connection,null,null);
    }
}
2.dao层
  • 接口
代码语言:javascript复制
/**
	支持事务的添加
*/
void save(Connection connection,User user);
  • 实现类
代码语言:javascript复制
/*
       支持事务的添加
*/
@Override
public void save(Connection connection, User user) {
    //定义必要信息
    PreparedStatement pstm = null;
    try {
        //1.获取连接
        connection = JDBCUtils.getConnection();
        //2.获取操作对象
        pstm = connection.prepareStatement("insert into user(uid,ucode,loginname,password,username,gender,birthday,dutydate)values(?,?,?,?,?,?,?,?)");
        //3.设置参数
        pstm.setString(1,user.getUid());
        pstm.setString(2,user.getUcode());
        pstm.setString(3,user.getLoginname());
        pstm.setString(4,user.getPassword());
        pstm.setString(5,user.getUsername());
        pstm.setString(6,user.getGender());
        pstm.setDate(7,new Date(user.getBirthday().getTime()));
        pstm.setDate(8,new Date(user.getDutydate().getTime()));
        //4.执行sql语句,获取结果集
        pstm.executeUpdate();
    }catch (Exception e){
        throw new RuntimeException(e);
    }finally {
        JDBCUtils.close(null,pstm,null);
    }
}

0 人点赞