JDBC PreparedStatement解决SQL注入方案

文章目录

  • 获取PreparedStatement对象
  • PreparedStatement是如何解决SQL注入问题的
  • PreparedStatement的 应用
  • 上述如何解决sql注入的问题呢?

在这里插入图片描述


获取PreparedStatement对象

PreparedStatement是Statement的子接口,可以防止sql注入问题。可以通过Connection接口中的prepareStatement(sql)方法获得PreparedStatement的对象。

方法如下所示:

//	创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
PreparedStatement prepareStatement(String sql);  

注意:sql提前创建好的。sql语句中需要参数。使用?进行占位。

举例:

select *from user where username='zhangsan' and password = '123456';

使用 ?进行占位

select * from user where username = ? and password = ?;
String sql = ”select * from user where username = ? and password = ?;

PreparedStatement是如何解决SQL注入问题的

步骤一:**PreparedStatement pstmt = conn.prepareStatement(sql);** -----需要你事先传递sql。如果sql需要参数,使用?进行占位。

步骤二:设置参数(执行sql之前):pstmt.setXXX(int index, 要放入的值) -----根据不同类型的数据进行方法的选择。第一个参数 index 表示的是 ?出现的位置。从1开始计数,有几个问号,就需要传递几个参数。

方法的参数说明:

第一个参数:int index ;表示的是问号出现的位置。 问号是从1开始计数

第二个参数:给问号的位置传入的值。

步骤三、执行,不需要在传递sql了。

pstmt.executeQuery();—执行select

pstmt.executeUpdate();—执行insert,delete,update


小结:

1.使用预编译接口PreparedStatement 好处:

1.解决sql注入问题
2.提供效率,对sql语句只会预编译一次

2.使用编译接口PreparedStatement步骤:

1)使用连接对象调用方法获取预编译接口对象:PreparedStatement  pstmt =  conn.prepareStatement(sql); 
2)给sql语句占位符赋值:pstmt.setXxx(第几个占位符,实际值)
3)运行sql语句:pstmt.executeQuery();---执行selectpstmt.executeUpdate();---执行insert,delete,update

PreparedStatement的 应用

import java.sql.*;
import java.util.Scanner;public class JDBCTest06 {public static void main(String[] args) throws Exception {/*使用PreparedStatement接口解决sql注入问题1.使用Connection接口对象调用方法,获取PreparedStatement预编译接口PreparedStatement prepareStatement(String sql)2.使用预编译接口  PreparedStatement的对象调用PreparedStatement接口中的方法给sql语句中的占位符赋值setXxx(第几个占位符,实际值)3.使用预编译接口  PreparedStatement对象调用PreparedStatement接口中的方法执行sqlResultSet executeQuery()  执行DQL(查询语句)int executeUpdate()    执行DML(增删改语句)*///1.创建键盘录入对象Scanner sc = new Scanner(System.in);//2.提示输入用户名和密码System.out.println("-------请输入用户名:-------");//获取用户名String inputUsername = sc.nextLine();System.out.println("-------请输入密码:-------");//获取密码String inputPassword = sc.nextLine();//3.获取数据//4.注册驱动//5.获取和数据库连接对象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day03_heima139", "root", "1234");//6.使用Connection接口对象调用方法,获取PreparedStatement预编译接口// PreparedStatement prepareStatement(String sql)String sql = "select * from user3 where username=? and password=?";PreparedStatement pst = conn.prepareStatement(sql);//2.使用预编译接口  PreparedStatement的对象调用PreparedStatement接口中的方法给sql语句中的占位符赋值//setXxx(第几个占位符,实际值)//第一个参数1表示上述sql语句中的第一个占位符(?)位置//inputUsername :表示给第一个占位符赋的实际值// zhangsan\'\ \-\-pst.setString(1,inputUsername);//第一个参数2表示上述sql语句中的第二个占位符(?)位置//inputPassword :表示给第二个占位符赋的实际值pst.setString(2,inputPassword);/*3.使用预编译接口  PreparedStatement对象调用PreparedStatement接口中的方法执行sqlResultSet executeQuery()  执行DQL(查询语句)*/ResultSet rs = pst.executeQuery();//8.处理结果集//用户名唯一,查询的是一条数据,所以这里使用if即可if(rs.next()){//rs.next() :如果当前指针指向的行有数据则返回true//获取用户名String username = rs.getString("username");//输出System.out.println("恭喜您,亲,登录成功,欢迎光临我的小店,你的用户名是"+username);}else{System.out.println("用户名或者密码错误");}//9.释放资源rs.close();pst.close();conn.close();}
}

上述如何解决sql注入的问题呢?

在方法 setXxx()内部解决的。
例如上述 st.setString(1,inputUsername); ,将输入的用户名 "zhangsan' -- " 传入给setString方法体中,在该方法体中使用转义符号 / ,将特殊符号给转义了,转义之后再发送给 mysql 服务器,那么特殊符号例如–就不是注释的意思就是普通字符,mysql 会认为用户名的值是:zhangsan' --




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

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

相关文章

耳夹式耳机哪个品牌好?热门品牌机型推荐

在移动互联网时代,耳机已然成为很多人生活里不可或缺的电子产品。不管是在上下班的途中,还是进行运动的时候,耳机都能为人们带来音乐的美妙享受,起到减轻压力的作用。 可是,长时间佩戴入耳式耳机存在一些弊端&#xf…

【无人机设计与控制】使用凸优化的无人机在存在威胁区域时的路径规划

摘要 本文提出了一种基于凸优化的无人机路径规划方法,旨在解决无人机在威胁区域中飞行的最优路径问题。该方法通过构建威胁区域的凸集表示,并结合凸优化算法,确保无人机能够在避开威胁区域的同时,沿着最优路径到达目标点。仿真结…

Ubuntu的源管理详解

Ubuntu的源管理详解 Ubuntu软件源是存储Ubuntu软件包的服务器,通过这些源,用户可以下载、安装或更新软件包。这篇文章将详细介绍Ubuntu如何查看、添加、修改和删除源,以及如何解决源相关的问题。 什么是软件源? Ubuntu软件源是…

无人机之编程基础原理

无人机编程基础原理涉及多个方面,主要包括无人机的基本原理、飞行控制算法、编程语言及算法应用等。以下是对这些方面的详细阐述: 一、无人机基本原理 无人机的基本原理是理解其结构、飞行原理、传感器和控制系统等的基础。无人机通常由机身、动力系统&…

中国山东著名国学大师起名专家颜廷利:人类的终极使命,超越地球的探索之旅

中国山东著名国学大师起名专家颜廷利:人类的终极使命,超越地球的探索之旅 人类的存在,不是为了留恋地球,而是为了离开地球…(升命学说) 安徽阜阳、海口、滁州、宜春、河南周口、新乡、茂名、宁夏.银川最好的专业取名…

【CSS in Depth 2 精译_032】5.4 Grid 网格布局的显式网格与隐式网格(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

【PGCCC】 复合索引和部分索引,竟然能让查询速度提升 275 倍!

索引对于加速数据库查询和提高 PostgreSQL 应用程序的性能至关重要。但是,并非所有索引都以相同的方式发挥作用。复合索引和部分索引是两种常见类型,每种类型都有不同的用途和对性能的影响。本文我们将深入探讨复合索引和部分索引是什么、它们如何运作以…

BUG——IMX6ULL编译正点原子Linux内核报错

最初编译的是正点原子改过的Linux内核,可能是版本问题,一直报错,无法成功编译。然后换成NXP官方Linux内核6.6版本,初始编译虽然也报各种错,但都是缺少库或相关工具,全部安装后就可以成功编译出镜像了&#…

运营商二要素接口如何用PHP实现调用

一、什么是手机二要素? 运营商二要素又称手机二要素,运营商二要素核验,手机二要素核验,即传入姓名、手机号码,校验此两项是否一致。实时核验,返回校验结果! 二、手机二要素适用哪些场景&#…

【逐行注释】MATLAB的程序,对比EKF(扩展卡尔曼滤波)和PF(粒子滤波)的滤波效果,附下载链接

文章目录 总述部分源代码运行结果扩展性 总述 本代码使用 M A T L A B MATLAB MATLAB实现了扩展卡尔曼滤波( E K F EKF EKF)和粒子滤波( P F PF PF)在状态估计中的对比分析。 主要功能包括: 参数设置:初始…

【apt-file命令详解:Linux下的包管理利器】

文章目录 前言一、apt-file命令简介二、安装apt-file三、apt-file命令的基本用法四、高级技巧五、总结 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊 &a…

基于SSM的“银发在线教育云平台”的设计与实现(源码+数据库+文档)

基于SSM的“银发在线教育云平台”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 首页页面图 健身养生详情页面 在线课堂界面 …

Intellij IDEA 通过数据库表生成带注解的Java实体类(lombok版)

前言:因为今天在写实体类的时候,发现表中的字段太多,而且又要加注解怕写错漏写,现在市面上也有许多插件,但是有些达不到代码简洁,需要修改。后来还是选择了采用groovy写了一个脚本编写,本来idea…

gitlab使用小结

GitLab 是一个基于 Git 的代码托管平台,提供了丰富的功能来管理代码仓库、CI/CD、项目管理等。以下是一些常用的 GitLab 命令和示例,帮助你更好地使用 GitLab。 1、 克隆仓库 克隆一个远程仓库到本地: git clone gitgitlab.example.com:us…

深圳mes制造系统的主要功能

深圳MES系统的主要功能包括以下几个方面: 生产计划管理:MES系统可以帮助企业制定生产计划,包括订单管理、生产排程、生产任务分配等,实现生产资源的合理配置和生产计划的优化。 生产过程控制:MES系统可以监控生产过程中…

SpringBoot技术栈的网上超市开发实践

2 系统开发技术 这部分内容主要介绍本系统使用的技术,包括使用的工具,编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今,已经超过25年了,依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

局域网远程命令重启电脑

只要知道远程服务器的管理员密码和IP地址,在局域网中的任意一台机器上打开“命令提示符”窗口,运行以下命令: 1、获取远程服务器的管理员权限 net use IP地址 "管理员密码" /user:administrator 2、使用shutdown命令远程重启服务器…

32中的外部中断

一、理解中断 关于32的中断 中断就是给cpu一个信号,cpu收到这个对应的信号再进行指挥 最常用的就是按键 key1按下是咩意思key2呢这样 中断信号线CPU要和对应的元器件连接 二、中断代码 代码编写 所有的0脚对应中断寄存器0,以此类推 引脚为n …

Unity :单例模式 + MonoBehaviour 是什么体验?

单例模式 与 MonoBehaviour的冲突点 单例模式 MonoBehaviour 保持单例的快速解决方案 就是自己创建一个空对象,然后把脚本挂在上去就行了,之后你就别自己挂载该脚本就行了 一般写法 public class AgentMoNo : MonoBehaviour {private static AgentM…

Python编码系列—Python观察者模式:实现事件驱动架构的利器

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…