JDBC PreparedStatement解决SQL注入方案

news2024/12/25 1:19:06

文章目录

  • 获取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();---执行select
	pstmt.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接口中的方法执行sql
                     ResultSet 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接口中的方法执行sql
                     ResultSet 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.coloradmin.cn/o/2160608.html

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

相关文章

AI最大的应用是什么,如何成为初代AGI产品经理?

❝ 在当今这个由数据驱动的时代,AI技术正以前所未有的速度发展,它不仅改变了我们与数字世界的互动方式,更在物理世界中掀起了一场革命。阿里巴巴集团CEO吴泳铭在2024云栖大会上的演讲,为我们描绘了AI技术未来的巨大潜力。他指出&a…

【浙江工业大学主办 | EI检索稳定】HCIVR 二轮截稿 时间

二轮截稿日期:2024年10月15日 收录检索:EI Compendex,Scopus 征稿主题: 光学手势识别系统、生物识别、眼动追踪和表情识别、光势行为分析、传感器技术、光学传感与虚拟现实交互、光学跟踪与定位系统、声光传感融合系统、基于VR的…

在WordPress中使用Simple Custom CSS and JS插件美化页面

目录 一、插件安装 二、添加代码 三、使用案例 1、图片居中 2、段落前空两格 3、添加版权声明 四、代码编写简述 WordPress是目前使用最广泛的开源建站框架,其主要功能就是“主题”(Theme)系统,该功能可以让用户自定义主题…

【网络协议栈】传输层的意义 和 UDP协议结构的解析(内含逻辑图解通俗易懂)

绪论​ “六年之约—jack”。本章是网络协议栈第二个主要模块 传输层,传输层在网络层中是非常重要的,他主要通过储存双方的端口记录数据的来源以及数据最终的去处,并且能一定的保证数据传输到达,以及快速高效的传递。本章主要讲到…

web群集--rocky9.2部署zabbix服务端的详细过程

文章目录 zabbix介绍1. Zabbix 简介2. Zabbix 的核心组件3. Zabbix 的工作原理4. Zabbix 的优势5. Zabbix 的应用场景 部署过程 zabbix介绍 1. Zabbix 简介 Zabbix 是一个 企业级开源监控工具,它能够对各种 IT 组件进行实时监控,包括网络设备、服务器、…

ES6的简单介绍(第二部分)

五 异步编程 5.1 回调函数 5.1.1 概念 回调函数(callback function),当一个函数作为参数传入另一个参数中,并且它不会立即执行,只有当满足一定条件后该函数才可以执行,这种函数就称为回调函数。 你可以将其理解为 回头再调用的意…

如何进行“服务器内部错误”的诊断 | OceanBase诊断案例

本文作者:任仲禹,爱可生数据库高级工程师,擅长故障分析和性能优化。 的OMS迁移工具具备丰富的功能。但在实际运维场景中,我们可能会遇到各种问题,其中“服务器内部错误”便是一个较为棘手的问题,因为界面上…

运行python程序

1 终端运行 1.1、直接在python解释器中书写代码 >>> print(法外狂徒) 法外狂徒 …

【C++掌中宝】走进C++引用的世界:从基础到应用

文章目录 引言1. 基础概念2. 引用与指针的区别3. 引用的应用场景3.1 引用作为函数参数3.2 引用作为函数返回值3.3 常引用(const引用)的使用3.4 引用与多态 4. C 引用的优缺点5. 引用的注意事项与常见陷阱6. 总结结语 引言 C 引用是编写高效、简洁代码的…

计算机视觉实战项目4(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

往期热门项目回顾: 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上-俯卧撑计数…

【JVM】JVM执行流程和内存区域划分

是什么 Java 虚拟机 JDK,Java 开发工具包JRE,Java 运行时环境JVM,Java 虚拟机 JVM 就是 Java 虚拟机,解释执行 Java 字节码 JVM 执行流程 编程语言可以分为: 编译型语言:先将高级语言转换成二进制的机器…

爆火南卡开放式耳机,音质性能霸榜TOP1,行业唯一达专业HiFi级音质标准!

爆火南卡开放式耳机,音质性能霸榜TOP1,行业唯一达专业HiFi级音质标准! 随着科技的不断进步,耳机市场迎来了又一次革命性的创新。南卡(NANK)品牌近日宣布,其最新力作——南卡Ultra耳夹开放式耳机…

大模型榜单汇总整理

大型语言模型(LLM)评估榜单提供了对不同模型性能的标准化比较,涵盖了从通用能力到特定领域应用的多个方面。这些榜单专注于评估模型在特定领域的应用能力,有助于开发者了解模型的优势和局限性,推动语言模型的发展和优化…

彩虹表攻击

彩虹表攻击是一种通过查找预计算哈希值来破解密码的技术。攻击者会生成一个包含大量常见密码及其哈希值的查找表,随后将这些哈希值与数据库中的密码哈希进行匹配,从而快速找出对应的明文密码。该攻击方法特别适用于使用弱密码且未进行加盐处理的系统。 相…

Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】

Spring Cloud Alibaba-(1)搭建项目环境 Spring Cloud Alibaba-(2)Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-(3)OpenFeign【服务调用】 Spring Cloud Alibaba-(4)Sen…

Windows电脑使用VNC远程桌面本地局域网内无公网IP树莓派5

目录 前言 1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS 2. Windows安装VNC远程树莓派 3. 使用VNC Viewer公网远程访问树莓派 3.1 安装Cpolar步骤 3.2 配置固定的公网地址 3.3 VNC远程连接测试 4. 固定远程连接公网地址 4.1 固定TCP地址测试 作者简介&#xff1…

在Windows系统上安装的 Arrow C++ 库

在Windows系统上安装的 Arrow C 库 正文第一步第二步第三步第四步注: 检查是否安装成功 吐槽 正文 第一步 git clone gitgithub.com:apache/arrow.git第二步 打开powershell (好像cmd也可以,不过我试了powershell中不报错,cmd中报错,不是很清楚为什么) 打开arrow的目录 cd …

利士策分享,如何培养良好的工作习惯?

利士策分享,如何培养良好的工作习惯? 在这个快节奏、高压力的职场环境中,培养良好的工作习惯不仅关乎个人职业发展的顺畅度, 更是提升工作效率、保持身心健康的关键。 以下是一些实用的建议,帮助你在日常工作中逐步构…

fiddler监听安卓http请求

下载安装Fiddler 官网 配置 选择Options 打开模拟器找到设置 打开app请求就能实现接口的监听了 https需要单独处理 参考 https://blog.csdn.net/lengdaochuqiao/article/details/88170522

靠AI视频在短视频平台接单月入过万,她怎么做到的?AI视频真的来了

大家好,我是画画的小强 相信大家和我一样,从小也有一个导演梦,感谢AI时代,替我完成了这个梦想,如果你想知道如何实现的,今天这篇文章,你一定要看完! 从去年11月份起,随…