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
英文地址,請注明出處:http://en.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. 介紹 …