zoukankan      html  css  js  c++  java
  • SQL注入现象

    package com.bjpowernode.jdbc;
    
    /*
        实现功能:
            1.需求:模拟用户登录功能的实现
            2.业务描述:程序运行的时候,提供一个输入的入口,可以让用户输入用户名和密码
                      用户输入用户和密码后,提交信息,java程序收集到用户信息
                      java程序连接数据库验证用户名和密码是否合法
                      合法:显示登陆成功
                      不合法:显示登陆失败
            3.数据的准备:
                   在实际开发中,表的设计会使用专业的建模工具,安装一个建模工具:PowerDesigner
                   使用PD工具来进行数据库表的设计(参见user-login.sql脚本)
            4.当前程序存在的问题:
                用户名:fdsa
                密码:fdsa' or '1'='1
                登陆成功
                这种现象被称为SQL注入(安全隐患)(黑客经常使用)
            5.导致SQL注入的根本原因是什么?
                用户输入的信息中含有sql语句的关键字,并且这些关键字参与sql语句的编译过程,
                导致sql语句的原意背扭曲,进而达到sql注入
     */
    
    import java.sql.*;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
    
    /**
     * @Author:杨青
     * @Description:
     * @Time:2021/10/25 11:34
     */
    public class JDBCTest06 {
        public static void main(String[] args) {
            //初始化一个界面
            Map<String,String> userLoginInfo=userinitUI();
            //验证用户名和密码
            boolean loginSuccess=login(userLoginInfo);
            System.out.println(loginSuccess?"登陆成功!":"登陆失败!");
        }
    
        /**
         * 用户登陆
         * @param userLoginInfo 用户登陆信息
         * @return  false表示失败,true表示成功
         */
        private static boolean login(Map<String, String> userLoginInfo) {
            //打标记的意识
            boolean loginSuccess=false;
            //单独定义变量
            String loginName=userLoginInfo.get("loginName");
            String loginPwd=userLoginInfo.get("loginPwd");
            //JDBC代码
            Connection conn=null;
            Statement stmt=null;
            ResultSet rs=null;
            try {
                //1.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2.获取连接
                conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","123456");
                //3.获取数据库操作对象
                stmt=conn.createStatement();
                //4.执行sql
    //            String sql = "select *from t_user where loginName='"+userLoginInfo.get("loginName")+"' and loginPwd='"+userLoginInfo.get("loginPwd")+"'";   //从userLoginInfor中取出loginName和loginPwd
                String sql = "select *from t_user where loginName='"+loginName+"' and loginPwd='"+loginPwd+"'";
                //以上正好完成了sql语句的拼接,以下代码的含义是:发送sql语句给DBMS,DBMS进行sql编译,
                //正好将用户提供的‘非法信息’编译进去,导致了原sql语句的含义被扭曲了
                rs=stmt.executeQuery(sql);
                //5.处理结果集
                if(rs.next()){
                    //登陆成功
                    loginSuccess=true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                //6.释放资源
                if(rs!=null)
                    try {
                        rs.close();
                    }catch (SQLException throwables) {
                        throwables.printStackTrace();
                    }
                if(stmt!=null)
                    try {
                        stmt.close();
                    }catch (SQLException throwables) {
                        throwables.printStackTrace();
                    }
                if(conn!=null)
                    try {
                        conn.close();
                    }catch (SQLException throwables) {
                        throwables.printStackTrace();
                    }
            }
    
    
            return loginSuccess;
        }
    
        /**
         * 初始化用户界面
         * @return 用户输入的用户名和密码等登陆信息
         */
        private static Map<String, String> userinitUI() {
            Scanner scanner=new Scanner(System.in);
            System.out.print("用户名:");
            String loginName=scanner.nextLine();    //得到用户名
            System.out.print("密码:");
            String loginPwd=scanner.nextLine();     //得到密码
            Map<String ,String> userLoginInfo=new HashMap<>();
            userLoginInfo.put("loginName",loginName);   //将loginName组装到Map中
            userLoginInfo.put("loginPwd",loginPwd);     //将loginPwd组装到Map中
            return userLoginInfo;
        }
    }
    

      

  • 相关阅读:
    Java IO流(一)
    Java File类
    LeetCode Notes_#16 3Sum Cloest
    LeetCode Notes_#15 3Sum
    LeetCode Notes_#11 Container with Most Water
    《[Wow!photoshop创意设计].李正贤.扫描版.pdf》
    计算机视觉新手指南
    对命名实体识别进行基准测试:StanfordNLP,IBM,spaCy,Dialogflow和TextSpace
    医学模型深度学习训练的挑战
    卷积神经网络(CNN)简易教程
  • 原文地址:https://www.cnblogs.com/-slz-2/p/15466439.html
Copyright © 2011-2022 走看看