码迷,mamicode.com
首页 > 数据库 > 详细

JDBC_07_SQL注入问题

时间:2021-04-19 15:34:17      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:Map集合   获取   用户登陆   ESS   mysq   enc   stat   finally   参与   

SQL注入问题

  • 导致SQL注入的根本原因是什么?

    • 用户输入的信息中含有sql语句的关键字,并且用户所输入的信息参与了sql语句的编译过程,导致sql语句的原意被扭曲。
  • 模拟用户登陆注册,演示sql注入

    
        import java.sql.*;
        import java.util.HashMap;
        import java.util.Map;
        import java.util.Scanner;
    
        /**
         * 存在sql注入问题隐患          例如输入:  ‘fdsa‘  fdsa‘ or‘1‘=‘1   就会登录成功,因为 or一边成立就成立,1恒等于1
         * 导致SQL注入的根本原因是什么?
         * 用户输入的信息中含有sql语句的关键字,并且用户所输入的信息参与了sql语句的编译过程,导致sql语句的原意被扭曲。
         */
        public class Main {
            public static void main(String[] args) throws SQLException {
    
                //掉用initUI()获取用户名密码
                 Map<String,String> userLoginInfo=initUI();
    
                //调用register()方法。
                //boolean registerSuccess=register(userLoginInfo);
    
                //输出结果
                //System.out.println(registerSuccess?"注册成功":"注册失败");
    
                //调用logIn()方法。
                boolean loginSuccess=login(userLoginInfo);
                System.out.println(loginSuccess?"登陆成功":"密码错误");
    
    
            }
    
    
    
            /**
             * 用户注册
             * @param userLoginInfo  用户登录信息
             * @return true成功, false失败
             */
    
            private static boolean register(Map<String, String> userLoginInfo) {
                //创建连接对象
                Connection connection=null;
                Statement statement=null;
                int count=0;
    
                try {
                    //注册驱动
                    Class.forName("com.mysql.cj.jdbc.Driver");
    
                    //获取连接
                    connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai",
                            "root","123456");
    
                    //获取数据库操作对象
                    statement=connection.createStatement();
    
                    //执行SQL语句
                    count=statement.executeUpdate("insert into t_user(loginName,loginPwd,realName)values(‘"+userLoginInfo.get("loginName")+"‘,‘"+userLoginInfo.get("loginPwd")+"‘,‘ ‘) ");
    
                } catch (ClassNotFoundException | SQLException e) {
                    e.printStackTrace();
                }finally {
                    if(statement!=null){
                        try {
                            statement.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
    
                    if(connection!=null){
                        try {
                            connection.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                }
                if(count==1){
                    return true;
                }
                return  false;
            }
    
    
    
    
            /**
             * 用户登录
             * @param userLoginInfo 用户信息
             * @return 成功true 失败fslse
             */
    
            private static boolean login(Map<String, String> userLoginInfo) throws SQLException {
    
                //标识
                boolean flag=false;
    
                //获取用户信息
                String loginName=userLoginInfo.get("loginName");
                String loginPwd=userLoginInfo.get("loginPwd");
    
                //创建连接对象
                Connection connection=null;
                Statement statement=null;
                ResultSet resultSet=null;
    
                try {
                    //注册驱动
                    Class.forName("com.mysql.cj.jdbc.Driver");
    
                    //获取连接
                    connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai",
                            "root","123456");
    
                    //获取数据库连接对象
                    statement=connection.createStatement();
    
                    //执行SQL语句
                    resultSet=statement.executeQuery("select * from t_user where loginName=‘"+loginName+"‘and loginPwd=‘"+loginPwd+"‘");
    
                    //处理查询结果集
                    if(resultSet.next()){
                        flag=true;
                    }
                } catch (ClassNotFoundException | SQLException e) {
                    e.printStackTrace();
                }finally {
                    if(resultSet!=null){
                        resultSet.close();
                    }
                    if(statement!=null){
                        statement.close();
                    }
                    if (connection!=null){
                        connection.close();
                    }
                }
    
                return  flag;
            }
    
    
    
            /**
             * 初始化用户界面
             * @return 返回用户登录信息
             */
            private static Map<String, String> initUI() {
    
                //创建用户信息接收对象
                Scanner scanner=new Scanner(System.in);
                
                //获取用户名
                System.out.println("请输入您的用户名:");
                String userName=scanner.nextLine();
    
                //获取密码
                System.out.println("请输入您的密码:");
                String pwd=scanner.nextLine();
    
                //创建一个Map集合用来存放用户输入得用户名和密码
                Map<String,String> userLoginInfo=new HashMap<String,String>();
    
               //存入Map集合
                userLoginInfo.put("loginName",userName);
                userLoginInfo.put("loginPwd",pwd);
    
    
               //返回该集合
                return userLoginInfo;
            }
        }

JDBC_07_SQL注入问题

标签:Map集合   获取   用户登陆   ESS   mysq   enc   stat   finally   参与   

原文地址:https://www.cnblogs.com/szqengr/p/14669632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!