欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jdbc用户登录与注册案例(包含数据库注入漏洞及解决方法)

程序员文章站 2022-05-21 12:16:25
里面使用的工具类JUtils用于注册驱动和连接数据库以及资源释放。详情见连接:原始用户表:数据库用户表登录package MS;import jdbcUtil.JUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Scanner;//用户登录public class j...

里面使用的工具类JUtils用于注册驱动和连接数据库以及资源释放。详情见连接:工具类详情

原始用户表:
jdbc用户登录与注册案例(包含数据库注入漏洞及解决方法)

  • 数据库用户表登录
package MS;

import jdbcUtil.JUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
//用户登录
public class jdbc6 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入用户名");
        String use= scanner.nextLine();
        System.out.println("请输入密码");
        String pwd=scanner.nextLine();
        boolean flag = new jdbc6().login(use, pwd);
        if(flag){
            System.out.println("登录成功");
        }else{
            System.out.println("用户名或密码错误");
        }
    }
    public boolean login(String username,String password){
        if(username==null||password==null){
            return false;
        }
        Connection connnection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        try {
            connnection= JUtils.getConnnection();
            statement = connnection.createStatement();
            String sql="select * from user where username= '"+username+"'  and password='"+password+"' ";
            resultSet = statement.executeQuery(sql);
            return resultSet.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JUtils.close(statement,connnection,resultSet);
        }
        return false;
    }
}

jdbc用户登录与注册案例(包含数据库注入漏洞及解决方法)

  • 数据库用户注册
package MS;

import jdbcUtil.JUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
//用户注册
public class jdbc6Add {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入用户名");
        String name= scanner.next();
        System.out.println("请输入密码");
        String pwd=scanner.next();
        boolean flag = new jdbc6Add().register(name, pwd);
        if (flag){
            System.out.println("注册成功");
        }else {
            System.out.println("注册失败");
        }
    }
    public boolean register(String name,String pwd)  {
        if(name==null||pwd==null){//保证注册的用户名和密码都必须填
            return false;
        }
        Connection connnection = null;
        Statement statement=null;
        try {
            connnection = JUtils.getConnnection();
            statement = connnection.createStatement();
            String sql="insert into user values(null,'"+name+"','"+pwd+"')";
            statement.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JUtils.close(statement,connnection);
        }
        return true;
    }
}

jdbc用户登录与注册案例(包含数据库注入漏洞及解决方法)
jdbc用户登录与注册案例(包含数据库注入漏洞及解决方法)

  • 数据库注入漏洞
    随便输入了一个用户名,密码使用了SQL的拼接,漏洞在于拼接,但是依然登录成功。这是相当危险的事。
    jdbc用户登录与注册案例(包含数据库注入漏洞及解决方法)
  • 解决方法之预编译(PreparedStatement)
package MS;

import jdbcUtil.JUtils;

import java.sql.*;
import java.util.Scanner;
public class jdbc6AddAdd {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入用户名");
        String use= scanner.nextLine();
        System.out.println("请输入密码");
        String pwd=scanner.nextLine();
        boolean flag = new jdbc6AddAdd().login(use, pwd);
        if(flag){
            System.out.println("登录成功");
        }else{
            System.out.println("用户名或密码错误");
        }
    }
    public boolean login(String username,String password){
        if(username==null||password==null){
            return false;
        }
        Connection connnection=null;
        PreparedStatement statement=null;//Statement的子类,用于解决数据库注入
        ResultSet resultSet=null;
        try {
            connnection= JUtils.getConnnection();
            String sql="select * from user where username=? and password=?";
            statement = connnection.prepareStatement(sql);
            statement.setString(1,username);//1表示sql语句的第一个?
            statement.setString(2,password);

            resultSet = statement.executeQuery();//这里就不用再传入sql了,否则会与预编译的结果冲突,抛异常
            return resultSet.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JUtils.close(statement,connnection,resultSet);
        }
        return false;
    }
}

jdbc用户登录与注册案例(包含数据库注入漏洞及解决方法)
现在就解决了数据库注入问题了。为了防止这个问题,如今的PreparedStatement以及取代了Statement。

本文地址:https://blog.****.net/weixin_44580398/article/details/107294867