• JDBC模拟登陆及SQL语句防注入问题


    实现模拟登陆效果:基于表Tencent

     1 package boom;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.ResultSet;
     6 import java.sql.SQLException;
     7 import java.sql.Statement;
     8 import java.util.Date;
     9 import java.util.Scanner;
    10 
    11 /**
    12  * 模拟登陆
    13  * 
    14  * @author Administrator
    15  *
    16  */
    17 public class JdbcLogin {
    18     public static void main(String[] args) {
    19         // 接收控制台信息
    20         Scanner scanner = new Scanner(System.in);
    21         // 提示语句
    22         System.out.println("请输入用户名:");
    23         String name = scanner.next();
    24         System.out.println("请输入密码:");
    25         String pwd = scanner.next();
    26 
    27         // 声明参数
    28         String driver = "oracle.jdbc.driver.OracleDriver";
    29         String url = "jdbc:oracle:thin:@localhost:1521:XE";
    30         String userName = "scott";
    31         String userPwd = "tiger";
    32 
    33         // 声明连接,初始化为空
    34         Connection connection = null;
    35         Statement statement = null;
    36         ResultSet resultSet = null;
    37 
    38         try {
    39             // 1.加载驱动
    40             Class.forName(driver);
    41             // 2.创建连接
    42             connection = DriverManager.getConnection(url, userName, userPwd);
    43             // 3.创建SQL命令发送器
    44             statement = connection.createStatement();
    45             // 4.发送SQL获取结果
    46             // 查询表里的对应数据源
    47             String sql = "select * from Tencent where uname = '"+name+"' and upwd = '"+pwd+"' ";
    48             System.out.println("HelloJdbcLogin.main(sql):"+sql);
    49             resultSet = statement.executeQuery(sql);
    50             //5:处理结果--判断是否有这个用户
    51             if(resultSet.next()){
    52                 System.out.println("HelloJdbcLogin.main(登陆成功)");
    53             }else{
    54                 System.out.println("HelloJdbcLogin.main(登陆失败)");
    55             }
    56             
    57         } catch (ClassNotFoundException e) {
    58             // TODO Auto-generated catch block
    59             e.printStackTrace();
    60         } catch (SQLException e) {
    61             // TODO Auto-generated catch block
    62             e.printStackTrace();
    63         } finally {
    64             // 6.关闭资源 【先开后关】
    65             try {
    66                 if (resultSet != null) {
    67                     resultSet.close();
    68                 }
    69             } catch (SQLException e) {
    70                 // TODO Auto-generated catch block
    71                 e.printStackTrace();
    72             }
    73             try {
    74                 if (statement != null) {
    75                     statement.close();
    76                 }
    77             } catch (SQLException e) {
    78                 // TODO Auto-generated catch block
    79                 e.printStackTrace();
    80             }
    81             try {
    82                 if (connection != null) {
    83                     connection.close();
    84                 }
    85             } catch (SQLException e) {
    86                 // TODO Auto-generated catch block
    87                 e.printStackTrace();
    88             }
    89         }
    90     }
    91 
    92 }
    View Code

    效果:

    --请输入用户名:
    迪丽热巴
    --请输入密码:
    1213456
    --HelloJdbcLogin.main(sql):select * from Tencent where uname = '迪丽热巴' and upwd = '1213456' 
    HelloJdbcLogin.main(登陆成功)
    ----------------------------------------------------------------------------------------------
    --请输入用户名:
    迪丽热巴
    --请输入密码:
    12346
    --HelloJdbcLogin.main(sql):select * from Tencent where uname = '迪丽热巴' and upwd = '12346' 
    HelloJdbcLogin.main(登陆失败)

    执行代码用SQL注入拼接实现【SQL注入成功】

    --请输入用户名:
    小喜庆
    --请输入密码:
    664654'or'1'='1
    --HelloJdbcLogin.main(sql):select * from Tencent where uname = '小喜庆' and upwd = '664654'or'1'='1' 
    HelloJdbcLogin.main(登陆成功)

    为什么会注入成功?

    Statement:不安全,拼接麻烦,阅读性差
    PreparedStatement:安全,阅读性好,(执行效率高)
    防止SQL注入风险:PreparedStatement

    // 声明连接,初始化为空
    Connection connection = null;
    // 修改Statement ==> PreparedStatement
    PreparedStatement ps = null;
    ResultSet resultSet = null;
    
    try {
    	// 加载驱动
    	Class.forName(driver);
    	// 创建连接
    	connection = DriverManager.getConnection(url, userName, userPwd);
    	// 创建SQL命令发送器
    	// ? 相当于占位符
    	String sql = "select * from Tencent where uname = ? and upwd =?";
    	ps=connection.prepareStatement(sql);
    	// 赋值占位
    	ps.setString(1, name);
    	ps.setString(2, pwd);
    	// 4.发送SQL获取结果
    	System.out.println("HelloJdbcLogin.main(sql):"+sql);
    	resultSet = ps.executeQuery();
    	//5:处理结果--判断是否有这个用户
    	if(resultSet.next()) {
    		System.out.println("HelloJdbcLogin.main(登陆成功)");
    	} else {
    		System.out.println("HelloJdbcLogin.main(登陆失败)");
    	}

    详细代码:

     1 package boom;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.util.Scanner;
     9 
    10 public class JdbcLogin2 {
    11     public static void main(String[] args) {
    12         // 接收控制台信息
    13         Scanner scanner = new Scanner(System.in);
    14         // 提示语句
    15         System.out.println("请输入用户名:");
    16         String name = scanner.next();
    17         System.out.println("请输入密码:");
    18         String pwd = scanner.next();
    19 
    20         // 声明参数
    21         String driver = "oracle.jdbc.driver.OracleDriver";
    22         String url = "jdbc:oracle:thin:@localhost:1521:XE";
    23         String userName = "scott";
    24         String userPwd = "tiger";
    25 
    26         // 声明连接,初始化为空
    27         Connection connection = null;
    28         PreparedStatement ps = null;
    29         ResultSet resultSet = null;
    30 
    31         try {
    32             // 1.加载驱动
    33             Class.forName(driver);
    34             // 2.创建连接
    35             connection = DriverManager.getConnection(url, userName, userPwd);
    36             // 3.创建SQL命令发送器
    37             //?相当于占位符
    38             String sql = "select * from Tencent where uname = ? and upwd =?";
    39             ps=connection.prepareStatement(sql);
    40             // 赋值
    41             ps.setString(1, name);
    42             ps.setString(2, pwd);
    43             // 4.发送SQL获取结果
    44             System.out.println("HelloJdbcLogin.main(sql):"+sql);
    45             resultSet = ps.executeQuery();
    46             //5:处理结果--判断是否有这个用户
    47             if(resultSet.next()){
    48                 System.out.println("HelloJdbcLogin.main(登陆成功)");
    49             }else{
    50                 System.out.println("HelloJdbcLogin.main(登陆失败)");
    51             }
    52             
    53         } catch (ClassNotFoundException e) {
    54             // TODO Auto-generated catch block
    55             e.printStackTrace();
    56         } catch (SQLException e) {
    57             // TODO Auto-generated catch block
    58             e.printStackTrace();
    59         } finally {
    60             // 6.关闭资源 【先开后关】
    61             try {
    62                 if (resultSet != null) {
    63                     resultSet.close();
    64                 }
    65             } catch (SQLException e) {
    66                 // TODO Auto-generated catch block
    67                 e.printStackTrace();
    68             }
    69             try {
    70                 if (ps != null) {
    71                     ps.close();
    72                 }
    73             } catch (SQLException e) {
    74                 // TODO Auto-generated catch block
    75                 e.printStackTrace();
    76             }
    77             try {
    78                 if (connection != null) {
    79                     connection.close();
    80                 }
    81             } catch (SQLException e) {
    82                 // TODO Auto-generated catch block
    83                 e.printStackTrace();
    84             }
    85         }
    86     }
    87 
    88 }
    View Code

    【SQL注入失败】

    --请输入用户名:
    小喜庆
    --请输入密码:
    664654'or'1'='1
    --HelloJdbcLogin.main(sql):select * from Tencent where uname = ? and upwd =?
    HelloJdbcLogin.main(登陆失败)
  • 相关阅读:
    mv 命令 简要
    mv 命令
    rmdir 命令
    rm 命令简要
    rm 命令
    mkdir 命令
    pwd 命令
    远程工具(SSH Secure)连接Centos出现中文乱码问题的解决办法
    (4)剑指Offer之链表相关编程题
    (4)剑指Offer之链表相关编程题
  • 原文地址:https://www.cnblogs.com/cao-yin/p/9768644.html
Copyright © 2020-2023  润新知