JdbcUtils的三個版本以及sql注入問題

JDBC的工具類 1.0版本
JDBC的工具類 2.0版本(智能一些),編寫properties屬性文件,程序就可以讀取屬性文件
JDBC的工具類 3.0版本,加入連接池對象

我們封裝jdbc工具類是為了減少代碼重復,方便開發,JdbcUtils至少要有三個方法

1.新建驅動

2.新建連接

3.關閉資源

1.0 這里的static是為了直接調用類方法,不用new對象

public class JdbcUtils1 {/*** 加載驅動的方法  static*/public static void loadDrive(){try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 連接對象conn*/public static Connection getConntion(){loadDrive();Connection connection = null;try {connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");} catch (SQLException e) {e.printStackTrace();}return connection;}/*** 獲取執行sql的對象  Statement*/public static Statement creatstmt() throws SQLException {Connection conntion = getConntion();Statement statement = conntion.createStatement();return statement;}/*** 關閉資源的提取*/public static  void close(ResultSet rs, Statement stmt, Connection conn){try {rs.close();stmt.close();conn.close();}catch (Exception e){e.printStackTrace();}}}

2.0 可以動態修改配置,不是寫死的了

?1. 驅動類
?2. 數據庫地址
?3. 用戶名
?4. 密碼

package com.qcby.utils;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** JDBC的工具類 1.0版本* JDBC的工具類 2.0版本(智能一些),編寫properties屬性文件,程序就可以讀取屬性文件*      1. 驅動類*      2. 數據庫地址*      3. 用戶名*      4. 密碼*/
public class JdbcUtils2 {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 = JdbcUtils2.class.getResourceAsStream("/db.properties");try {// 加載屬性文件pro.load(inputStream);} catch (IOException e) {e.printStackTrace();}// 給常量賦值driverclass = pro.getProperty("driverclass");url = pro.getProperty("url");username = pro.getProperty("username");password = pro.getProperty("password");}/*** 加載驅動*/public static void loadDriver(){try {// 加載驅動類Class.forName(driverclass);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 加載完驅動,獲取到連接,返回連接對象* @return*/public static Connection getConnection(){// 加載驅動loadDriver();// 獲取到連接對象,返回Connection conn = null;try {// 獲取到連接conn = DriverManager.getConnection(url,username,password);} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 關閉資源* @param conn* @param stmt* @param rs*/public static void close(Connection conn, Statement stmt, ResultSet rs){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();}}}/*** 關閉資源* @param conn* @param stmt*/public static void close(Connection conn, Statement stmt){if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

3.0 加入連接池對象

package com.qcby.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** JDBC的工具類 1.0版本* JDBC的工具類 2.0版本(智能一些),編寫properties屬性文件,程序就可以讀取屬性文件* JDBC的工具類 3.0版本,加入連接池對象*/
public class JdbcUtils3 {// 連接池對象private static DataSource DATA_SOURCE;static{// 加載屬性文件Properties pro = new Properties();InputStream inputStream = JdbcUtils3.class.getResourceAsStream("/druid.properties");try {// 加載屬性文件pro.load(inputStream);// 創建連接池對象DATA_SOURCE = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}/*** 從連接池中獲取連接,返回。* @return*/public static Connection getConnection(){Connection conn = null;try {conn = DATA_SOURCE.getConnection();} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 關閉資源* @param conn* @param stmt* @param rs*/public static void close(Connection conn, Statement stmt, ResultSet rs){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();}}}/*** 關閉資源* @param conn* @param stmt*/public static void close(Connection conn, Statement stmt){if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

連接池xml配置

 <!--配置連接池--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/spring_db?characterEncoding=utf8mb4" /><property name="username" value="root" /><property name="password" value="root" /></bean>

druid.properties配置

driverclass = com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/spring_db?useUnicode=true&characterEncoding=utf8
username=root
password=root

sql注入問題

/*** 演示SQL注入的問題,漏洞* 在已知用戶名的情況下,通過sql語言關鍵字,登錄系統。密碼隨意輸入的。* SQL注入產生原因是SQL語句的拼接,利用SQL關鍵字產生效果。* 需要解決SQL注入的問題** 解決SQL注入問題,采用SQL語句預編譯的方式,把SQL語句中的參數使用 ? 占位符來表示,先把SQL語句編譯,格式固定的。* 再給 ? 傳入值,傳入任何內容都表示值。數據庫會判斷SQL執行的結果。*** 解決sql注入問題:* 1.使用預編譯sql的PreparedStatement對象* 2.在通過PreparedStatement對象的set方法為每一個占位符賦值(避免了字符串拼接帶來的關鍵字問題)* 3.執行sql方法 stmt.executeQuery(); 拿到結果集*/
public class JdbcTest4 {public static void main(String[] args) {// 模擬登錄的功能,有SQL注入的問題String result = new JdbcTest4().login2("aaa'or'1=1", "12309809");System.out.println(result);//        String result = new JdbcTest4().login2("aaa", "123");
//        System.out.println(result);}/*** 采用預編譯的方式,解決SQL注入的問題* @param username* @param password* @return*/public String login2(String username,String password){Connection conn = null;// 預編譯執行SQL語句對象PreparedStatement stmt = null;ResultSet rs = null;try {// 獲取到連接conn = JdbcUtils3.getConnection();// 使用?占位符String sql = "select * from t_user where username = ? and password = ?";// 預編譯SQL語句,把SQL語句固定stmt = conn.prepareStatement(sql);// 需要給 ? 設置值stmt.setString(1,username);stmt.setString(2,password);// 執行SQL語句rs = stmt.executeQuery();// 遍歷數據if(rs.next()){// 表示存在數據,如果存在,說明用戶名和密碼編寫正確return "登錄成功...";}else{return "登錄失敗了...";}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils3.close(conn,stmt,rs);}return null;}/*** 模擬登錄的功能,通過用戶名和密碼從數據庫中查詢* @param username* @param password* @return*/public String login(String username,String password){Connection conn = null;Statement stmt = null;ResultSet rs = null;try {// 獲取到連接conn = JdbcUtils3.getConnection();// 編寫SQL語句的拼接  '1=1' true  password = '1234sdfsce' false  true and false  整體上false// String sql = "select * from t_user where username = 'aaa' or '1=1' and password = '1234sdfsce'";// String sql = "select * from t_user where username = 'aaa' or false";String sql = "select * from t_user where username = '"+username+"' and password = '"+password+"'";// 執行sqlstmt = conn.createStatement();// 執行rs = stmt.executeQuery(sql);// 遍歷數據if(rs.next()){// 表示存在數據,如果存在,說明用戶名和密碼編寫正確return "登錄成功...";}else{return "登錄失敗了...";}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils3.close(conn,stmt,rs);}return null;}}

數據庫

sql注入導致賬號密碼錯誤也顯示登錄成功

使用占位符就能避免這個問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86549.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AS32系列MCU芯片I2C模塊性能解析與調試

國科安芯推出的AS32X601內置的I2C模塊提供了符合工業標準的兩線串行制接口&#xff0c;可用于MCU和外部IIC設備的通訊。IIC總線使用兩條串行線&#xff1a;串行數據線SDA和串行時鐘線SCL。 IIC接口模塊實現了IIC協議的標準模式和快速模式&#xff0c;支持多主機IIC總線架構。其…

釘釘小程序開發實戰:打造一個簡約風格的登錄頁面

在上一篇文章中&#xff0c;我們已經介紹了如何搭建釘釘小程序的基礎環境&#xff0c;并完成了項目的初始化配置。本文將繼續深入&#xff0c;手把手帶你實現一個簡約風格的登錄頁面&#xff0c;這是大多數企業級應用不可或缺的一部分。 釘釘小程序基于前端 Web 技術棧&#x…

論文研讀2-1:多GNSS雙歷元純相位定位-模型建立與誤差分析

后續文章: 論文研讀2-2&#xff1a;多GNSS雙歷元純相位定位-固定模糊度精度增益 論文研讀2-3&#xff1a;多GNSS雙歷元純相位定位-定位精度分析 僅相位定位中的模糊度解算問題 在衛星導航定位中&#xff0c;載波相位測量是實現高精度定位的基礎&#xff0c;但如果僅使用相位測…

Python----OpenCV(圖像増強——圖像平滑、均值濾波、高斯濾波、中值濾波、雙邊濾波)

Python----計算機視覺處理&#xff08;Opencv&#xff1a;圖像噪點消除&#xff1a;濾波算法&#xff0c;噪點消除&#xff09; 一、圖像平滑 圖像平滑處理&#xff08;Smoothing Images&#xff09;&#xff0c;也稱為圖像模糊處理、圖像濾波&#xff08;Images Filtering&am…

筆記:使用EasyExcel導入csv文件出現編碼問題,導致導入數據全為null的解決方法

筆記&#xff1a;使用EasyExcel導入csv文件出現編碼問題&#xff0c;導致導入數據全為null的解決方法 通常情況下&#xff0c;我們使用excel導入&#xff0c;但是部分情況下或者領導要求&#xff0c;我們需要使用csv導入文件&#xff0c;但是csv文件模板下載之后會變成系統當前…

NL2SQL(Natural Language to SQL)優化之道:提升準確率與復雜查詢能力

自然語言 → SQL 的轉譯&#xff08;NL2SQL&#xff09;技術&#xff0c;是讓非技術用戶與數據庫“對話”的橋梁。而在實際應用中&#xff0c;我們不僅需要“能轉”&#xff0c;更要“轉得準、轉得全、轉得快”。 一、什么是 NL2SQL&#xff1f; NL2SQL&#xff08;Natural La…

java中map的循環方式

什么是Map集合&#xff1f; Map是Java中的一個接口&#xff0c;它用于存儲鍵-值對&#xff0c;并且鍵和值都可以是任意對象。它是Java集合框架中的一部分&#xff0c;并提供了一些方法來操作和訪問Map中的元素。 Map中的每個鍵都是唯一的&#xff0c;這意味著不能使用相同的鍵…

python學習筆記(深度學習)

文章目錄 1、概述2、學習內容2.1、pytorch 常見語法2.1.1、sum2.1.2、廣播機制2.1.3、張量2.1.4、DataLoader 2.2、普通語法2.2.1、迭代器 1、概述 本篇博客用來記錄&#xff0c;在深度學習過程中&#xff0c;常用的 python 語法內容 2、學習內容 2.1、pytorch 常見語法 2.…

力扣網C語言編程題:搜索二維矩陣(右上角->左下角解法)

一. 簡介 上一篇文章關于"在二維數組中查找某個元素"的問題&#xff0c;提供了兩種解題思路&#xff0c;文章如下&#xff1a; 力扣網C語言編程題&#xff1a;搜索二維矩陣的普通解法與二分查找法-CSDN博客 本文提供第三種解題思路&#xff1a;從左下角->右上角…

AI大模型流式輸出,OkHttp Log攔截打印方案

背景&#xff1a; 使用okhttp框架進行網絡訪問時&#xff0c;一般會使用 HttpLoggingInterceptor 打印請求和響應的log。在使用okhttp訪問AI大模型時&#xff0c;如果選擇流式輸出&#xff0c;那么響應的body數據使用的SSE技術&#xff0c;服務異步發送大模型生成的增量token&…

看數據世界的歷史:全面梳理從關系庫、大數據到AI時代的數據發展及展望

序章 在數據庫不斷發展的時代里&#xff0c;我們看到了關系型數據庫&#xff08;RDB&#xff09;在一次次的數據演變過程中的占據王位&#xff0c;捍衛了勝利&#xff0c;像一個王朝更替下的“王權”的故事&#xff0c;精彩有趣。 本篇就來探討下數據庫的發展興衰史&#xff0…

元宇宙與人工智能的融合:從虛擬世界到智能生態的IT新革命

文章目錄 引言&#xff1a;前沿技術重塑數字交互體驗一、元宇宙與AI融合的本質&#xff1a;虛擬空間與智能交互的交匯元宇宙賦能AI&#xff1a;AI賦能元宇宙&#xff1a; 二、元宇宙與AI融合的演進&#xff1a;從概念到產業熱潮三、核心技術&#xff1a;元宇宙與AI融合的基石與…

問卷調查[mqtt dht]

任務 this code uses esp32-wroom-32 and dht11 to read the humidty and temperature, besieds, it will send the meassage to the cloud platform. All communication is conducted through MQTT. 打分標準 您應該對以下代碼進行評級&#xff0c;并且必須遵守如…

swift 對象轉Json

在 Swift 中將對象轉換為 JSON 可以通過以下方法實現&#xff1a; 使用 Codable 協議 Swift 的 Codable 協議&#xff08;Encodable 和 Decodable 的組合&#xff09;是處理 JSON 編碼和解碼的推薦方式。 struct Person: Codable {var name: Stringvar age: Int }let person…

Python學習Day43

學習來源&#xff1a;浙大疏錦行 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt from PIL import Image import os # 設置隨機…

了解一下Unity AssetBundle 的幾種加載方式

Unity 的 AssetBundle 系統提供了多種加載方式&#xff0c;以滿足不同場景下的資源管理和性能需求。 同步加載&#xff08;LoadFromFile&#xff09; 同步加載使用 AssetBundle.LoadFromFile 方法從文件系統中直接加載 AssetBundle。這種方式會阻塞主線程&#xff0c;直到加載…

鴻蒙邊緣智能計算架構實戰:多線程圖像采集與高可靠緩沖設計

目錄 一、技術背景與挑戰二、鴻蒙邊緣計算架構的核心特性1. 分布式軟總線&#xff1a;打破設備孤島2. 輕量化多線程模型 三、多線程圖像采集的穩定性設計1. 分層緩沖隊列架構2. 線程優先級策略 四、邊緣側高可靠緩沖機制1. 基于分布式數據管理的容錯設計2. 動態帶寬調節 五、實…

excel中vba開發工具

1、支持單元格點擊出現彈框進行選擇 支持模多次模糊查詢 Private Sub CommandButton1_Click() Call vehicle_查詢 End SubPrivate Sub Worksheet_Activate()Call vehicle_取出車架號和公司名稱 取出不重復的車架號Sheet13.ComboBox1.Visible False 車架號顯示Sheet13.ComboB…

CatBoost:征服類別型特征的梯度提升王者

基于有序提升與對稱樹的下一代GBDT框架&#xff0c;重塑高維分類數據處理范式 一、CatBoost的誕生&#xff1a;解決類別特征的終極挑戰 2017年由俄羅斯Yandex團隊開源&#xff0c;CatBoost&#xff08;Categorical Boosting&#xff09;直指機器學習中的核心痛點&#xff1a;類…

使用 WSL 啟動ubuntu.tar文件

使用 WSL 啟動ubuntu.tar文件&#xff0c;可按以下步驟進行3&#xff1a; 檢查 WSL 版本&#xff1a;確保你的 WSL 版本為 2.4.8 或更高版本。可以在命令行中輸入wsl --update來更新 WSL 到最新版本。 設置默認 WSL 版本&#xff1a;如果還沒有將 WSL 2 設置為默認版本&#x…