好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

JDBC_07_SQL注入问题

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   参与   

查看更多关于JDBC_07_SQL注入问题的详细内容...

  阅读:23次