41.0/查询/sql注入安全问题以及解决方式。

news2024/11/23 0:27:12

41.1. 回顾

1. jdbc:[java database connection] java连接数据库
2. 完成了增删改操作。
   [1]加载驱动。Class.forName("com.mysql.cj.jdbc.Driver");
   [2]获取连接对象: Connection conn=DriverManager.getConnection(url,user,pass);
      url: jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai
   [3]获取执行sql语句的对象: Statement st=conn.createStatement();   
   [4]执行sql语句: st.executeUpdate(sql);
        sql: 增删改的sql.
           修改: update 表名 set 字段名=值,字段名=值.... where 条件
           添加: insert into 表名 values(值,值....);
           删除: delete from 表名 where 条件
           
   [5]关闭资源         

41.2. 正文

目录

41.1. 回顾

41.2. 正文

41.3 查询-所有

41.4 异常处理

41.5 sql注入安全问题

41.6企业级开发的模式


41.3 查询-所有

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


public class Test02 {
    public static void main(String[] args) throws Exception{
         //1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接对象
        String url="jdbc:mysql://localhost:3306/mydb";
        String user="root";
        String password="root";
        Connection conn= DriverManager.getConnection(url,user,password);
        //3.获取执行sql的对象
        Statement st=conn.createStatement();
        //4. 执行sql语句
        String sql="select * from tbl_emp";
        //把查询的结果封装到一个ResultSet对象中。
        ResultSet rs = st.executeQuery(sql);
        //5. 从resultSet中取出结果. next():指针往下移动并判断当前是否存在元素。  getXXX();获取当前行的指定列的值。
        while(rs.next()){
            System.out.println(rs.getInt("id")+"\t"+rs.getString("name")+"\t"+rs.getDouble("salary"));
        }
        //6. 关闭资源
        rs.close();
        st.close();
        conn.close();

    }
}

根据用户名查询: 查询姓李的人。

 

package com.demo01;

import java.sql.*;

public class Test05 {
    public static void main(String[] args) throws Exception {
        query();

    }

    public static void query() throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/day112303";
        String user = "root";
        String password = "634835";
        Connection conn = DriverManager.getConnection(url, user, password);

        Statement statement = conn.createStatement();
        String sql = "SELECT * FROM student WHERE s_name LIKE '李%'";
        statement.executeQuery(sql);
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()) {
            System.out.println(rs.getInt("s_id") + "\t" + rs.getString("s_name"));
        }
    }
}

 

41.4 异常处理

import java.sql.*;


public class Test02 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            //1. 加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接对象
            String url = "jdbc:mysql://localhost:3306/mydb";
            String user = "root";
            String password = "root";
            conn = DriverManager.getConnection(url, user, password);
            //3.获取执行sql的对象
            st = conn.createStatement();
            //4. 执行sql语句
            String sql = "select * from tbl_emp";
            //把查询的结果封装到一个ResultSet对象中。
            rs = st.executeQuery(sql);
            //5. 从resultSet中取出结果. next():指针往下移动并判断当前是否存在元素。  getXXX();获取当前行的指定列的值。
            while (rs.next()) {
                System.out.println(rs.getInt("id") + "\t" + rs.getString("name") + "\t" + rs.getDouble("salary"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //6. 关闭资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }

            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }

            }
        }


    }
}

41.5 sql注入安全问题

发现无论你输入任何的账户和密码 只要or 后面的条件成立

那么一定都可以登录成功。出现bug了。

问题出现在Statement类,该类存在sql注入安全隐患

为了解决该隐患,创建了一个子类PreparedStatement.  

 

import java.sql.*;
import java.util.Scanner;


public class Test03 {
    static String url = "jdbc:mysql://localhost:3306/mydb";
    static String user = "root";
    static String pwd = "root";

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入账户:");
        String u=sc.nextLine();
        System.out.print("请输入密码:");
        String p=sc.nextLine();// next()和nextLine()区别: next()输入空格 空格以后的内容无法获取

        boolean flag = login(u, p);
        if(flag==true){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
    }

    /**
     * 根据账户和密码判断是否登录成功
     *
     * @param name     输入的账户
     * @param password 输入的密码
     * @return true表示登录成功  false表示登录失败
     */
    public static boolean login(String name, String password) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, pwd);

            //?:表示占位符。--对sql预先编译。
            String sql = "select * from tbl_user where username=? and password=?";
            ps = conn.prepareStatement(sql);
            //为占位符赋值。int parameterIndex 第几个占位符, Object x 占位符的内容
            ps.setObject(1,name);
            ps.setObject(2,password);

            rs = ps.executeQuery();
            while (rs.next()) {
                return true;
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally
        {
            //6. 关闭资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }

            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        return false;

    }


}

根据账户和年龄查询用户信息 使用preparedStatement

41.6企业级开发的模式

dao类:

[data access object ] 数据访问对象层

包下都是用来访问数据对应表的操作

StudentDao: 该类专门用来操作Student表的,每个操作对应一个方法。

TeacherDao: 该类专门用来操作Teacher表,每个操作对应一个方法。

package com.ykq.dao;

import java.sql.*;


public class UserDao {
    String url = "jdbc:mysql://localhost:3306/mydb";
    String user = "root";
    String pwd = "root";
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    //每个操作对应一个方法。

    //1.根据id删除用户
    public int deleteById(int id) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, pwd);

            //?:表示占位符。--对sql预先编译。
            String sql = "delete from tbl_user where id=?";
            ps = conn.prepareStatement(sql);
            ps.setObject(1,id);

            int i = ps.executeUpdate();
            return i;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //6. 关闭资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }

            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }

        return 0;


    }


    //2. 添加用户
    public int insert(String username,String password,String realname){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, pwd);

            //?:表示占位符。--对sql预先编译。
            String sql = "insert into tbl_user(username,password,realname) values(?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setObject(1,username);
            ps.setObject(2,password);
            ps.setObject(3,realname);

            //执行sql
            int i = ps.executeUpdate();
            return i;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //6. 关闭资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }

            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }

        return 0;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1266290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Cisco Packet Tracer】DHCP/FTP/WEB/DNS实验

本文使用CiscoPacketTracer仿真软件实现了DHCP/FTP/WEB/DNS实验,拓扑中包含2个客户机和3个服务器(DHCP服务器、DNS服务器、FTP/WEB公用一个服务器),客户机的IP地址由DHCP服务器动态分配。 DHCP服务器IP地址:192.168.0…

制作电脑微信双开快捷方式

一、介绍 电脑下载的微信正常只能打开一个,那有时候需要双开甚至多开微信我们需要怎么操作呢? 我这里就讲一个制作微信双开快捷键方式的办法,争对其他应用也是一样的原理。 二、制作过程 1、右击微信快捷方式 2、点击属性 3、复制目标 …

nodejs+vue+elementui图书馆教室自习室座位预约管理系统93c8r

本系统利用nodejsVue技术进行开发自习室预约管理系统是未来的趋势。该系统使用的编程语言是nodejs,数据库采用的是MySQL数据库,基本完成了系统设定的目标,建立起了一个较为完整的系统。建立的自习室预约管理系统用户使用浏览器就可以对其进行…

AI旅游:旅游行业的人工智能成熟艺术适应从实践到表现报告

今天分享的是AI系列深度研究报告:《AI旅游:旅游行业的人工智能成熟艺术适应从实践到表现报告》。 (报告出品方:accenture) 报告共计:25页 旅行还没有充分利用AI所能做的一 而旅游业比两年前强多了。公司…

电脑格式化了怎么恢复原来的数据?您可以这样做

电脑是我们日常生活和工作中不可或缺的工具,然而,在一些情况下我们可能需要进行电脑格式化,比如为了清理系统垃圾、解决系统故障等。然而,格式化会导致所有数据被删除,给用户带来不便和困扰。本文将介绍电脑格式化了怎…

一文搞定XMLHttpRequest,AJAX,Promise,Axios及操作实战

XMLHttpRequest,AJAX,Promise,Axios都是发送异步请求的工具,只是使用的场合和方式有所不同。都是一种用于创建快速动态网页的技术 1、认识同步请求和异步请求? 1.1、认识同步请求? 1、我们点击淘宝首页的男装,进入男装页面的这…

vue3+vite+ts项目打包时出错

项目中引入了element-plus国家化的配置,然后进行项目打包,报下面的错误 解决方法: 在main.ts中添加 // ts-ignore

Ubuntu 22.04安装Go 1.21.4编译器

lsb_release -r看到操作系统版本是22.04,uname -r看到内核版本是uname -r。 sudo wget https://studygolang.com/dl/golang/go1.21.4.linux-amd64.tar.gz下载编译器。 sudo tar -zxf go1.21.4.linux-amd64.tar.gz -C /goroot将文件解压到/goroot目录下,这个命令…

基于多模态大数据的国家安全风险态势感知模型构建

源自:情报杂志 “人工智能技术与咨询” 发布 摘要 [研究目的]为强化国家安全情报能力,推动风险监测预警能力提升,构建基于多模态大数据的国家安全风 险态势感知模型。 [研究方法]首先,对国家安全风险态势感知进行阐释;然后,分析多模态大数据驱动下…

JSP forEach标签遍历 java bean类型的list集合

好 之前我讲了 forEach 标签 但只是说了基本的使用 但我们实际开发中 还是循环遍历对象数组最多 就是一个java bean类型的list集合 那么 首先 我们要提供一个java bean 我们在java目录下 创建一个目录 我这里叫 attribute 下面创建一个类 叫users 参考代码如下 package com.e…

网络篇---第六篇

系列文章目录 文章目录 系列文章目录前言一、HTTP1.0、HTTP1.1、HTTP2.0的关系和区别二、说说HTTP协议与TCP/IP协议的关系三、如何理解HTTP协议是无状态的?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

信息可视化在数字孪生中的应用:打造直观决策支持系统

在当今的数字化时代,数字孪生和信息可视化已成为推动各行业发展的重要力量。数字孪生为物理世界提供了一个虚拟的副本,而信息可视化则将复杂的数据以易于理解的方式呈现出来。两者之间的关系密切,相辅相成,为决策者提供了更全面、…

程序设计基础中可能出现的简单编程题2(以郑大为主体)

我们在学习编程过程中往往不仅有C语言实验报告,还有程序设计实验报告。程序设计这一科目主要是为了培养我们写代码时的计算思维,养成从问题到代码实现逐步分析,逐步深入的好习惯。前面有一篇文章介绍了部分程序设计实验报告中的编程题&#x…

Python 分解IP段获取所有IP(子网掩码)

需求 192.168.1.0/24,192.168.2.1-192.168.2.254,192.168.3.3 IP段格式已 "," 分割,获取所有IP 注意 1. 判断 IP 是否合规 2. 去除多余的字符,例如空格、换行符 3. 去重 代码 import re import ipaddressdef isIP(ip):p re.compile(^((…

嵌入式常见协议---IIC协议

1.IIC(IC)协议是什么? 全称 Inter-Integrated Circuit ,字面意思是集成电路之间,是IC BUS简称,中文应该叫集成电路总线,是一种串行通信总线(同步串行半双工),使用多主从…

会议预告 | 求臻医学诚邀您共聚P4 2023第七届肿瘤精准医疗大会

2023年12月7日-8日,P4 2023第七届肿瘤精准医疗大会将于北京隆重举行。60余位院士/监管/临床医生/科研权威专家与精准药企/诊断企业KOL领衔出席,1000余位精准医疗领域行业精英代表齐聚现场,大会将深度探讨行业痛点与年度热门议题,与…

HarmonyOS 后台任务管理开发指南上线!

为什么要使用后台任务?开发过程中如何选择合适的后台任务?后台任务申请时存在哪些约束与限制? 针对开发者使用后台任务中的疑问,我们上线了概念更明确、逻辑结构更清晰的后台任务开发指南,包含具体的使用场景、详细的开…

一维数组,逆序存放并输出【样例输入】20 30 10 50 40 90 80 70【样例输出】70 80 90 40 50 10 30 20

一维数组&#xff0c;逆序存放并输出 【样例输入】 20 30 10 50 40 90 80 70 【样例输出】 70 80 90 40 50 10 30 20 以下是使用C语言编写的将一维数组逆序存放并输出的示例代码&#xff1a; #include <stdio.h>void reverseArray(int arr[], int size) {int start…

超声波眼镜清洗机都有哪些是比较值得入手的?眼镜清洗机推荐

在当今社会&#xff0c;眼镜已经成为了我们日常生活中不可或缺的一部分。然而&#xff0c;眼镜的清洗问题却一直困扰着许多人。眼镜上的污垢和油脂不仅影响其美观&#xff0c;更重要的是可能会对眼睛的健康产生不良影响。因此&#xff0c;我们需要一种高效的眼镜清洗机来帮助我…

《微信小程序开发从入门到实战》学习三十四

4.2 云开发JSON数据库 MySQL、Oracle之类的“关系型数据库”。JSON数据库是“非关系型数据库”&#xff0c;没有行表列的概念。 4.2.1 JSON数据库基本概念 集合:一个数据库有多个集合&#xff0c;一个集合存储通常是同一类数据&#xff0c;可看作为JSON数组&#xff0c;数组…