CC00088.bigdatajava——|Java&MySQL.JDBC.V13|——|MySQL.v13|Jdbc开发_使用预处理对象解决SQL注入|

一、[使用预处理对象解决SQL注入]
### --- PreparedStatement接口介绍

——>        PreparedStatement 是 Statement 接口的子接口,继承于父接口中所有的方法。
——>        它是一个预编译的 SQL 语句对象.
——>        预编译: 是指SQL 语句被预编译,并存储在 PreparedStatement 对象中。
——>        然后可以使用此对象多次高效地执行该语句。
### --- PreparedStatement 特点

——>        因为有预先编译的功能,提高 SQL 的执行效率。
——>        可以有效的防止 SQL 注入的问题,安全性更高
### --- 获取PreparedStatement对象

——>        通过Connection创建PreparedStatement对象
Connection 接口中的方法说明
PreparedStatement prepareStatement(String sql)
指定预编译的 SQL 语句,
SQL 语句中使用占位符 ? 创建一个语句对象
二、PreparedStatement接口常用方法
常用方法说明
int executeUpdate();执行insert update delete语句.
ResultSet executeQuery(); 执行select语句. 返回结果集对象 Resulet
### --- 使用PreparedStatement的步骤
——>        编写 SQL 语句,未知内容使用?占位:

"SELECT * FROM jdbc_user WHERE username=? AND password=?";
——>        获得 PreparedStatement 对象 3) 设置实际参数:
——>        setXxx( 占位符的位置, 真实的值) 4) 执行参数化 SQL 语句 5)关闭资源
setXxx重载方法说明
void setDouble(int parameterIndex, double x) 将指定参数设置为给定 Java double 值。
void setInt(int parameterIndex, int x)将指定参数设置为给定 Java int 值。
void setString(int parameterIndex, String x) 将指定参数设置为给定 Java String 值。
void setObject(int parameterIndex, Object x) 使用给定对象设置指定参数的值。
### --- 使用PreparedStatement完成登录案例

——>        使用 PreparedStatement 预处理对象,可以有效的避免SQL注入
### --- 步骤:

——>        获取数据库连接对象 
——>       2.编写SQL 使用? 占位符方式 
——>       3.获取预处理对象 (预编译对象会将Sql发送给数据库 进行预编译) 
——>       4.提示用户输入用户名 & 密码 
——>       5.设置实际参数:setXxx(占位符的位置, 真实的值) 
——>       6.执行查询获取结果集
——>       7.判断是否查询到数据 
——>       8.关闭资源
public class TestLogin02 {
    
    /**
     * 使用预编译对象 PrepareStatement 完成登录案例
     * @param args
     * @throws SQLException
     */
    public static void main(String[] args) throws SQLException {

        //1.获取连接
        Connection connection = JDBCUtils.getConnection();

        //2.获取Statement
        Statement statement = connection.createStatement();

        //3.获取用户输入的用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名: ");
        String name = sc.nextLine();
        
        System.out.println("请输入密码: ");
        String pass = sc.nextLine();
        System.out.println(pass);
        

        //4.获取 PrepareStatement 预编译对象

        //4.1 编写SQL 使用 ? 占位符方式
        String sql = "select * from jdbc_user where username = ? and password = ?";
        PreparedStatement ps = connection.prepareStatement(sql);

        //4.2 设置占位符参数
        ps.setString(1,name);
        ps.setString(2,pass);

        //5. 执行查询 处理结果集
        ResultSet resultSet = ps.executeQuery();
        
        if(resultSet.next()){
        
            System.out.println("登录成功! 欢迎您: " + name);
        }else{
        
            System.out.println("登录失败!");
        }
        
        //6.释放资源
        JDBCUtils.close(connection,statement,resultSet);
    }
}
三、sql语句
package com.yanqi.jdbc05;

        import com.yanqi.jdbc05.JdbcUtils;

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

public class JdbcLogin02 {

    /*
     * SQL注入
     *   用户输入的用户名和密码 与我们编写的SQL进行了拼接,用户输入的内容成为了SQL语法的一部分,
     *   用户会利用这里漏洞 输入一些其他的字符串,改变SQL原有的意思
     *
     * 如果解决
     *   要解决SQL注入 就不能让用户输入的数据和我们的SQL进行直接的拼接
     *
     * 预处理对象 PrepareStatement 他是 Statement接口的子接口
     *   使用预处理对象 他有预编译的功能,提高SQL的执行效率
     *   使用预处理对象 通过占位符的方式 设置参数 可以有效的防止SQL注入
     *
     *
     * */
    public static void main(String[] args) throws SQLException {

        //1.获取连接
        Connection con = JdbcUtils.getConnection();

        //2.获取PrepareStatement 预处理对象
        //使用 ? 占位符的方式来设置参数
        String sql = "select * from jdbc_user where username = ? and password = ?";
        PreparedStatement ps = con.prepareStatement(sql);

        //3.获取用户输入的用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名: ");
        String name = sc.nextLine();

        System.out.println("请输入密码: ");
        String pass = sc.nextLine();

        //4.设置参数 使用setXXX(占位符的位置(整数),要设置的值)的方法设置占位符的参数
        ps.setString(1,name); // 设置第一个问号值 为 name
        ps.setString(2,pass);

        //5.执行查询
        ResultSet resultSet = ps.executeQuery();

        //6.处理结果集
        //6.处理结果集
        if(resultSet.next()){

            System.out.println("登录成功! 欢迎您: " + name);
        }else{

            System.out.println("登录失败! ");
        }

        //7.关闭流
        JdbcUtils.close(con,ps,resultSet);
    }
}
四、打印输出
#密码正确正常登录
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=61404:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "E:\NO.Z.10000——javaproject\NO.H.00002.mysql\mysql\out\production\mysql.jdbc;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\dom4j-1.6.1.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\druid-1.0.9.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\c3p0-0.9.5.2.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-dbcp-1.4.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\jaxen-1.1-beta-6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-pool-1.5.6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-dbutils-1.6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\mchange-commons-java-0.2.12.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\mysql-connector-java-5.1.37-bin.jar;C:\Users\Administrator\.m2\repository\org\jetbrains\annotations\18.0.0\annotations-18.0.0.jar;C:\Users\Administrator\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.yanqi.jdbc05.JdbcLogin02
请输入用户名: 
tom
请输入密码: 
123456
登录成功! 欢迎您: tom

Process finished with exit code 0

#密码错误拒绝登录
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=61420:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "E:\NO.Z.10000——javaproject\NO.H.00002.mysql\mysql\out\production\mysql.jdbc;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\dom4j-1.6.1.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\druid-1.0.9.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\c3p0-0.9.5.2.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-dbcp-1.4.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\jaxen-1.1-beta-6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-pool-1.5.6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-dbutils-1.6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\mchange-commons-java-0.2.12.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\mysql-connector-java-5.1.37-bin.jar;C:\Users\Administrator\.m2\repository\org\jetbrains\annotations\18.0.0\annotations-18.0.0.jar;C:\Users\Administrator\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.yanqi.jdbc05.JdbcLogin02
请输入用户名: 
111
请输入密码: 
111
登录失败! 

Process finished with exit code 0

#用户名和密码不正确但是登陆失败;sql注入的失败
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=61452:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "E:\NO.Z.10000——javaproject\NO.H.00002.mysql\mysql\out\production\mysql.jdbc;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\dom4j-1.6.1.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\druid-1.0.9.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\c3p0-0.9.5.2.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-dbcp-1.4.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\jaxen-1.1-beta-6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-pool-1.5.6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\commons-dbutils-1.6.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\mchange-commons-java-0.2.12.jar;F:\NO.Z.02000——soft——IT.实验\20210801——Hadoop\20210801.2——Hadoop——第二阶段——预科班\预科班第二阶段模块一\05 任务五 (JDBC)\03_软件\myJar\mysql-connector-java-5.1.37-bin.jar;C:\Users\Administrator\.m2\repository\org\jetbrains\annotations\18.0.0\annotations-18.0.0.jar;C:\Users\Administrator\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.yanqi.jdbc05.JdbcLogin02
请输入用户名: 
zbc
请输入密码: 
zbc' or '1'='1
登录失败! 

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值