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;
    }
}

  

posted @ 2021-10-26 16:31  石乐智先生  阅读(86)  评论(0编辑  收藏  举报