|NO.Z.00088|——————————|BigDataEnd|——|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 0Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor
 
                     
                    
                 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号 
