• SQL注入问题


    实现功能:

    1、需求:
            模拟用户登录功能的实现。
    2、业务描述:
        程序运行的时候,提供一个输入的入口,可以让用户输入用户名和密码
        用户输入用户名和密码之后,提交信息,java程序收集到用户信息
        Java程字连接数据库验证用户名和密码是否合法
        合法:显示登录成功
        不合法:显示登录失败
    3、数据的准备:
        在实际开发中,表的设计会使用专业的建模工具,我们这里安装一一个建模工具: PowerDesigner
        使用pD工具来进行数据库表的设计。(为了方便我已经把建表代码放在下面)

    SQL表:user_login.sql:

    drop table if exists t_user;
    
    /*==============================================================*/
    /* Table: t_user                                                */
    /*==============================================================*/
    create table t_user
    (
       id                   bigint auto_increment,
       userName             varchar(255),
       userPwd              varchar(255),
       name                 varchar(255),
       primary key (id)
    );
    insert  into t_user(userName,userPwd,name) values('zhangsan','123','张三');
    insert  into t_user(userName,userPwd,name) values('llisi','123','李四');
    commit;
    select * from t_user;

    连接数据库测试代码:

    import java.sql.*;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
    
    public class Test07_模拟用户登良功能的实现 {
        public static void main(String[] args) {
            //初始化一个界面的方法
            Map<String,String> userLogin = chuShiHuaUi();
            //验证用户名和密码
            Boolean dengLu = login(userLogin);
            //最后输出结果
            System.out.println(dengLu ? "登录成功!" : "登录失败!");
        }
    
        private static Boolean login(Map<String, String> userLogin) {
            //打标记
            Boolean b = false;
    
            Connection conn = null;
            Statement s = null;
            ResultSet rs = null;
            try{
                //1、注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2、获取连接
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/donglijiedian","root","zhixi158");
                //3、获取数据库操作对象
                s = conn.createStatement();
                //4、操作MySQL //SQL语句中字符串是'',要想获取数据要加双引号,中间加上数据
    
                String sql = "select * from t_user where userName = '"+userLogin.get("userName")+"' and userPwd = '"+userLogin.get("userPwd")+"'";
                rs = s.executeQuery(sql);
                //5、处理查询结果集
                //用户名错的情况下查不到记录,用户名正确情况下也最多查出一条记录,所以用if就够了
                if(rs.next()){
                    return true;//如果存在这条记录就返回
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally {
                //6、释放资源,由内到外
                try{
                    if(rs != null)
                        rs.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
                
                try{
                    if(s != null)
                        s.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
    
                try{
                    if(conn != null)
                        conn.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            return b;
        }
    
        private static Map<String, String> chuShiHuaUi() {
            Scanner s = new Scanner(System.in);
            //获取用户名
            System.out.println("用户名:");
            String userName  = s.nextLine();//nextLine返回一行数据
    
            //获取密码
            System.out.println("密码:");
            String userPwd = s.nextLine();
    
            //组装Map集合
            Map<String,String> userLogin  = new HashMap<>();
            userLogin.put("userName",userName);//添加用户名
            userLogin.put("userPwd",userPwd);//添加密码
            return userLogin;//返回集合数据
        }
    }

    SQL注入问题:

    在我们测试的时候,验证用户名和密码发现是没有问题的。

     但是我们输入一些特定的字符,就发现了问题:

     发现输入一些执行的字符会出现登录成功,这显然是不符合我们的需求的。

    解决SQL注入的方法:

    https://www.cnblogs.com/zhangzhixi/p/14109810.html
    

      

  • 相关阅读:
    [Spring开发]获取上下文对象
    [Dubbo开发]Dubbo日志插件实现(打包)
    [Dubbo开发]Dubbo日志插件实现(未打包)
    [Java开发]打印当前路径到控制台
    [Dubbo开发]Dubbo拦截器(Filter)初探
    [Dubbo开发]配置简单的生产者和消费者
    [Dubbo开发]Zookeeper配置
    [Dubbo开发]Maven安装与配置
    EL表达式的特性
    oracle中rownum的使用
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/14109692.html
Copyright © 2020-2023  润新知