JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码

一、概念

JDBC是java数据库连接技术的字母缩写(Java DataBase Connectivity)。

JDBC就是使用JAVA程序连接数据库,操作数据库中的数据库,使用数据库存储程序中运行的各种数据。

可以这样理解:JDBC就是一座桥梁,用来连接数据库和Java程序的。

二、工作原理

JDBC有一系列的接口和类,都集成在java.sql和javax.sql中。

其中有一个类DriverManager,是用来管理各种不同的驱动。因为数据库有很多种,各种数据库之间的SQL语句有些差别,所以要连接不同的数据库,就需要使用到各自数据库的驱动,DriverManager就是用来做驱动管理的。

JDBC驱动负责连接不同类型的数据库,JAVA连接不同的数据库,需要导入对应数据库的驱动。

三、JDBC连接数据库步骤

①DriverManager加载驱动

②获取Connection连接

③创建Statement执行SQL语句

④返回ResultSet查询结果

四、JDBC查询数据库

查询需要三个对象:

Ⅰ.Connection负责连接数据库

Ⅱ.Statement负责执行SQL

Ⅲ.ResultSet查询的结果集

下面我们来进行代码实例展示:

展示使用的MySql,表名为students,SQL语句:

CREATE TABLE `students` (
  `sid` varchar(8) NOT NULL,
  `sname` varchar(255) DEFAULT NULL,
  `gender` varchar(255) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第1张图片

①使用JDBC查询数据库

需要使用到的方法:executeQuery(String sql)执行SQL语句

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class SelectTest {
	public static void main(String[] args) {
		//连接对象
		Connection conn = null;
		//执行SQL语句对象
		Statement st = null;
		//查询的结果集
		ResultSet rs = null;
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//获取连接
			conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "1234");
			//获取执行SQL对象
			st = conn.createStatement();
			//SQL语句
			String sql = "select * from students";
			//获取执行SQL的结果
			rs = st.executeQuery(sql);
			//输出结果
			while(rs.next()){
				System.out.print(rs.getString(1));
				System.out.print(rs.getString(2));
				System.out.print(rs.getString(3));
				System.out.print(rs.getDate(4));
				System.out.println(rs.getString(5));
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(rs != null){
					rs.close();
				}
				if(st != null){
					st.close();
				}
				if(conn != null){
					conn.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第2张图片

②使用JDBC对数据库进行增删改

需要使用到的方法executeUpdate(String sql)可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数

下面代码只演示增加的操作

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class UpdateTset {
	public static void main(String[] args) {
		Connection conn = null;
		Statement st = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "1234");
			st = conn.createStatement();
			String sql = "insert into students values('S0000005','小明','男','2018-01-01','银川')";
			int count = st.executeUpdate(sql);
			if(count > 0){
				System.out.println("新增成功!");
			}else{
				System.out.println("新增失败!");
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(st != null){
					st.close();
				}
				if(conn != null){
					conn.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第3张图片

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第4张图片

③JDBC实现登录

我们登录的时候,将用户名和密码放入SQL语句中,然后在数据库中查找,找到就表示能登录,找不到就不允许登录,这里使用的SQL语句是拼接的方式,写完代码再来说拼接方式的不好之处。

首先建立一张用户表:

CREATE TABLE `users` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第5张图片

下面代码实现登录:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class LoginTest {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		
		System.out.println("请输入您的账号:");
		String name=input.next();
		
		System.out.println("请输入密码:");
		String pass=input.next();
		
		Connection conn=null;
		Statement stmt=null;
		ResultSet rs=null; //查询结果集
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "1234");
			String sql="select * from users where username='"+name+"' and password='"+pass+"'"; //登陆sql
			stmt = conn.createStatement();
			rs=stmt.executeQuery(sql);
			if(rs.next()){
				System.out.println("欢迎您:"+name+",登陆成功~!");
			}else{
				System.out.println("账号或者密码错误!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				//关闭资源
				if(rs!=null){
					rs.close();
				}
				if(stmt!=null){
					stmt.close();
				}
				if(conn!=null){
					conn.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

我先输入正确密码:

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第6张图片

再输入错误的用户或密码:

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第7张图片

下面使用SQL注入来破解:

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第8张图片

tom在我们的数据库users表里面是没有的,那怎么会登录成功呢?只要我们在密码处输入类似于100'or'1'='1这样的符号,就能登录成功,下面通过图来讲解:

当我们输入100'or'1'='1这个的时候,SQL语句拼接成:select * from users where username='tom' and password='100'or'1'='1';

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第9张图片

我们使用or把SQL语句分成两部分,一部分是false,后面部分是true,false or true 的结果是true,所以这个等式是恒成立的,所以能够登录成功,即破解密码。

JDBC的学习(一)——概念和基本操作、SQL注入破解登录密码_第10张图片

使用这种方式也可以,#的作用是注释掉后面的SQL语句,原理同上面类似。

我会在接下来的博客中给出如何解决SQL注入破解的方法:https://blog.csdn.net/qq_41061437/article/details/82664612

你可能感兴趣的:(JDBC学习)