JDBC的使用和SQL注入问题

基本的JDBC使用:

1package demo; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.ResultSet; 6import java.sql.SQLException; 7import java.sql.Statement; 8 9import org.junit.Test; 10 11/** 12 * 测试查询所有用户的类 13 * 14 */ 15public class QueryAll { 16 17 @Test 18 public void testQueryAll(){ 19 Connection conn= null; 20 Statement stmt = null; 21 ResultSet rs = null; 22 try { 23 //1.注册驱动 24 Class.forName("com.mysql.jdbc.Driver"); 25 //2.获取连接 26 String url ="jdbc:mysql://localhost:3306/mybase"; 27 String username="root"; 28 String password="xuyiqing"; 29 conn = DriverManager.getConnection(url,username,password); 30 //3.获取执行sql语句对象 31 stmt = conn.createStatement(); 32 //4.编写sql语句 33 String sql = "select * from user"; 34 //5.执行sql语句 35 rs = stmt.executeQuery(sql); 36 //6.处理结果集 37 while(rs.next()){ 38 System.out.println("用户名:"+rs.getString(2)+" 密码:"+rs.getString("upassword")); 39 } 40 } catch (Exception e) { 41 e.printStackTrace(); 42 }finally{ 43 if(rs!=null) 44 try { 45 rs.close(); 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 } 49 if(stmt!=null) 50 try { 51 stmt.close(); 52 } catch (SQLException e) { 53 e.printStackTrace(); 54 } 55 if(conn!=null) 56 try { 57 conn.close(); 58 } catch (SQLException e) { 59 e.printStackTrace(); 60 } 61 } 62 } 63}

View Code

接下来分析SQL注入问题:

数据库准备:

1CREATE DATABASE mybase; 2USE mybase; 3CREATE TABLE users( 4uid INT PRIMARY KEY AUTO_INCREMENT, 5username VARCHAR(64), 6upassword VARCHAR(64) 7); 8INSERT INTO users (username,upassword) VALUES("zhangsan","123"),("lisi","456"),("wangwu","789"); 9SELECT * FROM users;

JDBC代码:

1package demo; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.ResultSet; 6import java.sql.Statement; 7 8import org.junit.Test; 9 10public class TestLogin { 11 12 @Test 13 public void testLogin() { 14 try { 15 login("zhangsan", "123"); 16 } catch (Exception ex) { 17 ex.printStackTrace(); 18 } 19 } 20 21 public void login(String username, String password) throws Exception { 22 Class.forName("com.mysql.jdbc.Driver"); 23 String url = "jdbc:mysql://localhost:3306/mybase"; 24 String usern = "root"; 25 String pwd = "xuyiqing"; 26 Connection conn = DriverManager.getConnection(url, usern, pwd); 27 Statement stmt = conn.createStatement(); 28 String sql = "select * from users where " + "username='" + username + "'and upassword='" + password + "'"; 29 ResultSet rs = stmt.executeQuery(sql); 30 if (rs.next()) { 31 System.out.println("登录成功"); 32 System.out.println(sql); 33 } else { 34 System.out.println("账号或密码错误!"); 35 } 36 if (rs != null) { 37 rs.close(); 38 } 39 if (stmt != null) { 40 stmt.close(); 41 } 42 if (conn != null) { 43 conn.close(); 44 } 45 } 46}

View Code

这时候运行,输出:

登录成功
select * from users where username='zhangsan'and upassword='123'

如果这样:

login("zhangsan", "1234");

输出:

账号或密码错误!

但是,如果这样做:

1 @Test 2 public void testLogin() { 3 try { 4 login("zhangsan' or 'zhangsan", "666"); 5 } catch (Exception ex) { 6 ex.printStackTrace(); 7 } 8 }

输出却是登录成功!:

登录成功
select * from users where username='zhangsan' or 'zhangsan'and upassword='666'

明显数据库中没有这个用户和相应的密码,但是登录成功,这里就是简单的SQL注入攻击

解决办法:

1.分开验证,先判断用户存在否

2.预处理对象,使用如下的方法:

1package demo; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import org.junit.Test; 8 9public class TestLogin { 10 11 @Test 12 public void testLogin() { 13 try { 14 login("zhangsan' or 'zhangsan", "666"); 15 } catch (Exception ex) { 16 ex.printStackTrace(); 17 } 18 } 19 20 public void login(String username, String password) throws Exception { 21 Class.forName("com.mysql.jdbc.Driver"); 22 String url = "jdbc:mysql://localhost:3306/mybase"; 23 String usern = "root"; 24 String pwd = "xuyiqing"; 25 Connection conn = DriverManager.getConnection(url, usern, pwd); 26 String sql = "select * from users where username=? and upassword=?"; 27 PreparedStatement pstmt = conn.prepareStatement(sql); 28 pstmt.setString(1, username); 29 pstmt.setString(2, password); 30 ResultSet rs = pstmt.executeQuery(); 31 if (rs.next()) { 32 System.out.println("登录成功"); 33 System.out.println(sql); 34 } else { 35 System.out.println("账号或密码错误!"); 36 } 37 if (rs != null) { 38 rs.close(); 39 } 40 if (pstmt != null) { 41 pstmt.close(); 42 } 43 if (conn != null) { 44 conn.close(); 45 } 46 } 47}

View Code

这时候输出的账号或密码错误,解决了上边的SQL注入问题

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o