我是靠谱客的博主 落后芒果,最近开发中收集的这篇文章主要介绍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:JAVAjdk-11.0.2binjava.exe "-javaagent:D:IntelliJIDEAIntelliJ IDEA 2019.3.3libidea_rt.jar=61404:D:IntelliJIDEAIntelliJ IDEA 2019.3.3bin" -Dfile.encoding=UTF-8 -classpath "E:NO.Z.10000——javaprojectNO.H.00002.mysqlmysqloutproductionmysql.jdbc;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJardom4j-1.6.1.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJardruid-1.0.9.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarc3p0-0.9.5.2.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-dbcp-1.4.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarjaxen-1.1-beta-6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-pool-1.5.6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-dbutils-1.6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarmchange-commons-java-0.2.12.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarmysql-connector-java-5.1.37-bin.jar;C:UsersAdministrator.m2repositoryorgjetbrainsannotations18.0.0annotations-18.0.0.jar;C:UsersAdministrator.m2repositoryjunitjunit4.12junit-4.12.jar;C:UsersAdministrator.m2repositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.yanqi.jdbc05.JdbcLogin02
请输入用户名:
tom
请输入密码:
123456
登录成功! 欢迎您: tom
Process finished with exit code 0
#密码错误拒绝登录
D:JAVAjdk-11.0.2binjava.exe "-javaagent:D:IntelliJIDEAIntelliJ IDEA 2019.3.3libidea_rt.jar=61420:D:IntelliJIDEAIntelliJ IDEA 2019.3.3bin" -Dfile.encoding=UTF-8 -classpath "E:NO.Z.10000——javaprojectNO.H.00002.mysqlmysqloutproductionmysql.jdbc;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJardom4j-1.6.1.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJardruid-1.0.9.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarc3p0-0.9.5.2.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-dbcp-1.4.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarjaxen-1.1-beta-6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-pool-1.5.6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-dbutils-1.6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarmchange-commons-java-0.2.12.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarmysql-connector-java-5.1.37-bin.jar;C:UsersAdministrator.m2repositoryorgjetbrainsannotations18.0.0annotations-18.0.0.jar;C:UsersAdministrator.m2repositoryjunitjunit4.12junit-4.12.jar;C:UsersAdministrator.m2repositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.yanqi.jdbc05.JdbcLogin02
请输入用户名:
111
请输入密码:
111
登录失败!
Process finished with exit code 0
#用户名和密码不正确但是登陆失败;sql注入的失败
D:JAVAjdk-11.0.2binjava.exe "-javaagent:D:IntelliJIDEAIntelliJ IDEA 2019.3.3libidea_rt.jar=61452:D:IntelliJIDEAIntelliJ IDEA 2019.3.3bin" -Dfile.encoding=UTF-8 -classpath "E:NO.Z.10000——javaprojectNO.H.00002.mysqlmysqloutproductionmysql.jdbc;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJardom4j-1.6.1.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJardruid-1.0.9.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarc3p0-0.9.5.2.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-dbcp-1.4.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarjaxen-1.1-beta-6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-pool-1.5.6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarcommons-dbutils-1.6.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarmchange-commons-java-0.2.12.jar;F:NO.Z.02000——soft——IT.实验20210801——Hadoop20210801.2——Hadoop——第二阶段——预科班预科班第二阶段模块一 5 任务五 (JDBC) 3_软件myJarmysql-connector-java-5.1.37-bin.jar;C:UsersAdministrator.m2repositoryorgjetbrainsannotations18.0.0annotations-18.0.0.jar;C:UsersAdministrator.m2repositoryjunitjunit4.12junit-4.12.jar;C:UsersAdministrator.m2repositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.yanqi.jdbc05.JdbcLogin02
请输入用户名:
zbc
请输入密码:
zbc' or '1'='1
登录失败!
Process finished with exit code 0
最后
以上就是落后芒果为你收集整理的CC00088.bigdatajava——|Java&MySQL.JDBC.V13|——|MySQL.v13|Jdbc开发_使用预处理对象解决SQL注入|的全部内容,希望文章能够帮你解决CC00088.bigdatajava——|Java&MySQL.JDBC.V13|——|MySQL.v13|Jdbc开发_使用预处理对象解决SQL注入|所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复