JDBC工具类和SQL 注入问题

在软件开发中,数据库安全与高效访问一直是关键课题。本文将围绕 SQL 注入问题的原理、解决方案,以及 JDBC 开发中的工具类演进和连接池技术展开探讨,结合实际代码示例,为开发者提供清晰的技术实践指南。

SQL 注入问题的核心原理与典型场景

运算符优先级引发的安全漏洞

SQL 注入问题中,AND 和 OR 的优先级差异是一个容易被忽视的风险点。AND 的运算优先级高于 OR,这一特性若被恶意利用,会导致 SQL 语句的逻辑被篡改。例如,当用户输入 “aaa'or'1=1” 作为用户名时,拼接后的 SQL 语句可能变为 “SELECT * FROM users WHERE username = 'aaa'or'1=1' AND password = '123'”。由于 “1=1” 恒成立,且 OR 的存在使得整个条件为真,攻击者无需正确密码即可绕过认证。

字符串拼接:注入漏

SQL 注入产生的根本原因是直接使用字符串拼接方式构建 SQL 语句。这种方式使得用户输入的内容直接参与 SQL 语句的结构组成,若用户输入包含 SQL 关键字或特殊字符,就会改变语句的原意。如在登录功能中,若采用 “SELECT * FROM users WHERE username = '” + username + “' AND password = '” + password + “'” 的拼接方式,当用户名输入 “aaa'or'1=1” 时,语句会被解析为无条件查询,导致安全漏洞。

 

预编译技术:SQL 注入的高效解决方案

PreparedStatement 的工作机制

解决 SQL 注入问题的核心方案是采用预编译的 SQL 语句,通过 PreparedStatement 对象实现。其原理是将 SQL 语句的结构与参数分离,先对 SQL 语句进行编译,格式固定后,再为占位符 “?” 传入具体值。数据库会将这些值作为纯粹的数据处理,而非 SQL 代码,从而避免了关键字被恶意解析的风险。

代码实现示例

public class JdbcTest4 {public String login2(String username, String password) {// 预编译SQL语句,使用占位符String sql = "SELECT * FROM t_user WHERE username = ? AND password = ?";try (Connection conn = JdbcUtils.getConnection();PreparedStatement stmt = conn.prepareStatement(sql)) {// 为占位符赋值stmt.setString(1, username);stmt.setString(2, password);ResultSet rs = stmt.executeQuery();if (rs.next()) {return "登录成功";}} catch (SQLException e) {e.printStackTrace();}return "登录失败";}
}

JDBC 工具类的演进与实践优化

 为啥需要工具类呢? 因为在上个案例中的dao层的代码,很多都是重复的

1. 数据库连接的创建

每次进行数据库操作前,都需要创建数据库连接。例如:

Connection conn = null;
try {// 加载驱动类Class.forName("com.mysql.jdbc.Driver");// 创建连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();
}

这段代码在每个需要访问数据库的方法中几乎都会重复出现。

2. SQL 语句的执行和结果处理

执行查询、插入、更新或删除操作时,需要编写类似的代码结构:

Statement stmt = null;
ResultSet rs = null;
try {// 创建Statement对象stmt = conn.createStatement();// 执行SQL查询rs = stmt.executeQuery("SELECT * FROM users");// 处理结果集while (rs.next()) {// 提取数据String username = rs.getString("username");// ...}
} catch (SQLException e) {e.printStackTrace();
}

无论执行何种 SQL 语句,都需要创建 Statement 对象、处理异常和结果集。

3. 资源的关闭

操作完成后,需要关闭 ResultSet、Statement 和 Connection 对象:

finally {// 关闭资源(顺序:ResultSet → Statement → Connection)if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

这段关闭资源的代码必须在每个数据库操作中重复编写,且顺序不能错(先关闭 ResultSet,再关闭 Statement,最后关闭 Connection)。

1.0 版本:硬编码与局限性

早期的 JDBC 1.0 版本工具类中,驱动注册、数据库连接地址、用户名和密码等信息均为硬编码方式。例如:

DriverManager.registerDriver(new Driver());
conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "root");

这种方式存在明显缺陷,当数据库配置发生变化时,需要修改代码并重新部署,灵活性和可维护性较差。

 

2.0 版本:属性文件与动态配置

改进后的 2.0 版本通过属性文件实现配置信息的动态读取,提高了工具类的通用性。以 db.properties 文件为例:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbcdemo
username=root
password=root

代码中通过静态代码块加载属性文件:

public class JdbcUtils {private static final String driverClass;private static final String url;private static final String username;private static final String password;static {Properties pro = new Properties();InputStream inputStream = JdbcUtils.class.getResourceAsStream("/db.properties");pro.load(inputStream);driverClass = pro.getProperty("driverClass");url = pro.getProperty("url");username = pro.getProperty("username");password = pro.getProperty("password");// 加载驱动Class.forName(driverClass);}
}

final 静态常量一开始就要有赋值,赋值后不可改变。 static代码块在方法前启动。

这种方式实现了配置与代码的分离,便于维护和扩展。

连接池技术:提升数据库访问效率的关键

池化思想的核心价值

连接池技术基于 “资源复用” 的池化思想,其核心优势在于:

  • 避免频繁创建和销毁数据库连接的开销,提升系统性能。
  • 控制连接数量,防止数据库因连接过多而负载过高。
  • 实现连接的统一管理和回收,提高资源利用率。

连接池的工作机制

连接池的工作流程如下:

  1. 初始化时创建一定数量的连接放入池中(如 initialSize=5)。
  2. 应用程序需要连接时,从池中获取可用连接,若池中空闲连接不足,根据配置规则(如 maxWait=3000)等待或创建新连接(不超过最大连接数)。
  3. 使用完毕后,将连接放回池中,而非直接关闭,以供后续使用。
  4. 池化管理会自动维护连接状态,清理失效连接,保持合理的连接数量(如 minIdle=3,maxIdle=6)。

以 Druid 连接池为例,其配置文件如下:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbcdemo
username=root
password=root
initialSize=5
maxWait=3000
maxIdle=6
minIdle=3

 

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

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

相关文章

2022年SEVC SCI2区,分数阶蚁群算法FACA:一种基于分数阶长期记忆的合作学习方法,深度解析+性能实测

目录 1.摘要2.分数阶微积分基础知识3.分数阶蚁群算法FACA4.分数阶蚁群算法FACA数学证明与分析5.结果展示6.参考文献7.代码获取8.算法辅导应用定制读者交流 1.摘要 本文提出了一种新颖分数阶蚁群算法(Fractional-Order Ant Colony Algorithm, FACA&#…

java+vue+SpringBoo数字科技风险报告管理系统(程序+数据库+报告+部署教程+答辩指导)

源代码数据库LW文档(1万字以上)开题报告答辩稿ppt部署教程代码讲解代码时间修改工具 技术实现 开发语言:后端:Java 前端:vue框架:springboot数据库:mysql 开发工具 JDK版本:JDK1.…

YOLOv12_ultralytics-8.3.145_2025_5_27部分代码阅读笔记-augment.py

augment.py ultralytics\data\augment.py 目录 augment.py 1.所需的库和模块 2.class BaseTransform: 3.class Compose: 4.class BaseMixTransform: 5.class CutMix(BaseMixTransform): 6.class CopyPaste(BaseMixTransform): 7.def v8_transforms(dataset, img…

跨芯片 AI 算子库 FlagGems 正式加入PyTorch 基金会生态项目体系

2025年北京智源大会 PyTorch Day China 论坛上,PyTorch 基金会执行董事 Matt White 宣布高性能通用 AI 算子库 FlagGems 项目获得批准,正式加入 PyTorch 生态项目体系。Pytorch基金会于6月26日在推特上进行了官方宣布。 作为唯一支持多种AI芯片架构的算…

vue + vue-router写登陆验证的同步方法和异步方法,及页面组件的分离和后端代码

先写一个用vue cdn写一个登陆验证的小示例后端代码 前端719.html <div id"app"><div id"loginForm">//路由层&#xff0c;登陆页和后台主页<router-link to"/">Login</router-link><router-link to"/home&quo…

.netcore 一个mvc到静态html实现

一、新建Mvc项目 Program.cs添加拦截 二、添加一个集成测试 将页面转为html到wwwroot下面 UnitGenHtml.cs using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.VisualStudio.TestPlatform.TestHost;namespace SaaS.OfficialWeb…

实现Taro小程序+nut-ui左滑删除效果

Taro小程序开发中&#xff0c;使用nut-ui组件&#xff0c;实现左滑删除卡片效果&#xff08;自定义删除按钮样式&#xff09; html代码部分 <nut-swipe class"carBox" v-for"(item, index) in carList" :key"item" :ref"(el) > se…

LLM 系列(五):模型训练篇

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…

Oracle LogMiner分析日志的三种方法示例

Oracle LogMiner分析日志的三种方法示例 方法一:Online Catalog作为日志挖掘字典自动获取日志模式手动获取日志模式方法二:Redo Log作为日志挖掘字典自动获取日志模式手动获取日志模式方法三:Flat File作为日志挖掘字典自动获取日志模式手动获取日志模式📖 Oracle LogMine…

Java 中 List.stream() 的全面使用指南(含完整示例)

标签&#xff1a;Java8, Stream API, 函数式编程, 集合操作 一、前言 随着 Java 8 的推出&#xff0c;Stream API 成为了处理集合数据的一种高效方式。List.stream() 是 Java Stream API 的入口方法之一&#xff0c;它允许开发者将集合转换为流&#xff0c;并通过链式调用实现…

香港 8C 站群服务器买来可以做哪些业务?

香港8C站群服务器&#xff08;即提供8个不同C段IP地址的服务器&#xff09;凭借多IP独立分配、低延迟网络及免备案优势&#xff0c;适用于以下关键业务场景&#xff1a; 一、SEO优化与搜索引擎运营 SEO站群搭建&#xff1a;为 80-100 个网站分配 8 个不同 C 段 IP &#xff0…

UI前端与数字孪生融合新趋势:智慧医疗的可视化诊断辅助

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;数字孪生重塑智慧医疗诊断范式 在医疗数字化转型的浪潮中&#xff0c;数…

OpenBayes 一周速览丨Nanonets-OCR-s深度语义理解,精准结构化转换;HLE人类问题推理基准上线,含2.5k题目,助力封闭式评估体系构建

公共资源速递 5 个公共数据集&#xff1a; * Brain Tumor 脑肿瘤数据集 * HLE 人类问题推理基准数据集 * OpenThoughts3-1.2M 推理数据集 * Nemotron-Personas 人物角色数据集 * OpenMathReasoning 数学推理数据集 14 个公共教程&#xff1a; 音频生成 * 2 视频生成 *…

ABB CH-3185 3 bhl 000986 p 1006 ab ability 800 xa自动化系统

安全性总结(续) 操作环境 在AC 800M控制器系统上线之前&#xff0c;调查哪些环境条件适用。请特别注意以下几点: 控制器不得暴露在超过相关技术规范中给定值的条件下。 控制器不得在暴露于强电气干扰的环境中使用。电机可能产生超过设备允许水平的干扰&#xff0c;例如在维…

【算法】动态规划 斐波那契类型:1137. 第 N 个泰波那契数

1137. 第 N 个泰波那契数 简单 相关标签 premium lock icon 相关企业 提示 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a; 输入&am…

图像编辑新变革 !ComfyUI-Kontext-fp8本地部署教程,120B参数对标闭源巨头

一、介绍 ComfyUI 是一个强大的、模块化的 Stable Diffusion 界面与后端项目。该用户界面将允许用户使用基于图形/节点/流程图的界面设计和执行高级稳定的扩散管道。 关于 FLUX.1 Kontext Dev FLUX.1 Kontext 是 Black Forest Labs 最新推出的突破性多模态图像编辑模型&#…

软件安装——下载安装ollama

一、下载&#xff08;模型管理工具&#xff09;&#xff1a; 下载地址&#xff1a;Ollama 二、自定义安装&#xff1a; 1.令行安装方式如下&#xff1a; 在OllamaSetup.exe所在目录打开cmd命令行&#xff0c;然后命令如下&#xff1a; OllamaSetup.exe /DIRE:\AllEdit\Ai…

springboot集成mqtt收发消息

在 Spring Boot 中使用 MQTT 可以通过集成 Eclipse Paho 或 HiveMQ 等客户端库实现。以下是完整的整合步骤&#xff0c;包括配置、发布和订阅消息的示例。 1. 添加 MQTT 依赖 在 pom.xml 中添加 Paho MQTT 客户端依赖&#xff1a; <dependency><groupId>org.spri…

Java 编程之备忘录模式

前言 有时候&#xff0c;我们真希望人生能有“CtrlZ”。在日常生活中&#xff0c;我们经常使用“撤销”功能&#xff0c;例如在写 Word、画图、写代码时一不小心操作失误&#xff0c;就希望能回到之前的状态。这种**“状态快照 恢复”**机制&#xff0c;在设计模式中就叫做&a…

yolov13+bytetrack的目标跟踪实现

目录 1. 介绍 2. 相关工作 (Related Works) 3. 方法 (Method) 4. 统计和结果 5. 技术实现 ByteTrack: Multi-Object Tracking by Associating Every Detection Box 1. Motivation 2. BYTE 3. ByteTrack 具体代码 UI界面设计 历史记录 完整代码实现UI界面 1. 介绍 …