最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDBC中Statement的Sql注入問題詳解

 更新時間:2023年10月16日 11:30:32   作者:發(fā)光吖  
這篇文章主要介紹了JDBC中Statement的Sql注入問題詳解,sql注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入web應(yīng)用程序,而這些輸入大都是sql語法里的一些組合,通過執(zhí)行sql語句進而執(zhí)行攻擊者所要做的操作,需要的朋友可以參考下

Statement的Sql注入問題

sql注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入web應(yīng)用程序,而這些輸入大都是sql語法里的一些組合,通過執(zhí)行sql語句進而執(zhí)行攻擊者所要做的操作,其產(chǎn)生的主要原因在于應(yīng)用程序沒有細(xì)致地過濾用戶輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)。

我們通過一個用戶登錄的小案例來大致了解sql注入的情況:(Oracle數(shù)據(jù)庫環(huán)境)

首先準(zhǔn)備一張表t_user:

在這里插入圖片描述

create table t_user(
	name varchar2(10) primary key,
	password varchar2(10) not null
)

插入一些測試數(shù)據(jù):

insert into t_user(name,password) values('tom','123');
insert into t_user(name,password) values('mary','456');
commit;

所使用的數(shù)據(jù)庫驅(qū)動:ojdbc8.jar

用JDBC連接數(shù)據(jù)庫,寫一個登錄案例:

public class TestSqlInjection {
	public static void main(String[] args) {
		String driverClass = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String user = "briup";
		String password = "briup";

		@SuppressWarnings("resource")
		Scanner input = new Scanner(System.in);
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			Class.forName(driverClass);
			conn = DriverManager.getConnection(url, user, password);
			stmt = conn.createStatement();
			System.out.println("請輸入用戶名:");
			String uname = input.nextLine();
			System.out.println("請輸入密碼:");
			String upass = input.nextLine();
			String sql = "SELECT name,password FROM t_user WHERE name='" + uname + "' AND password='" + upass + "'";
			// uname xxx
			// upass xxx' or '1'='1
			rs = stmt.executeQuery(sql);
			if (rs.next()) {
				System.out.println("登錄成功");
				// 這時候我們認(rèn)為用戶名和密碼都正確情況下查詢出來的用戶肯定只有一條
				System.out.println("歡迎您," + uname);
			} else {
				System.err.println("用戶名或密碼錯誤!");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			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();
				}
			}
		}
	}
}

效果:

在這里插入圖片描述

很顯然使用Statement的確產(chǎn)生了sql注入的問題。

但是使用PreparedStatement可以有效解決這個問題。

public class TestSqlInjection {
	public static void main(String[] args) {
		String driverClass = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String user = "briup";
		String password = "briup";

		@SuppressWarnings("resource")
		Scanner input = new Scanner(System.in);
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			Class.forName(driverClass);
			conn = DriverManager.getConnection(url, user, password);
			String sql = "SELECT name,password FROM t_user WHERE name=? AND password=?";
			ps = conn.prepareStatement(sql);
	        //uname xxx
	        //upass xxx' or '1'='1
			System.out.println("請輸入用戶名:");
			String uname = input.nextLine();
			ps.setString(1, uname);
			System.out.println("請輸入密碼:");
			String upass = input.nextLine();
			ps.setString(2, upass);
			rs = ps.executeQuery();
			if (rs.next()) {
				System.out.println("登錄成功");
				System.out.println("歡迎您," + uname);
			} else {
				System.err.println("用戶名或密碼錯誤!");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

PreparedStatement 除了可以防止sql注入,在執(zhí)行大量重復(fù)性插入語句時,也會明顯提升程序運行的性能,同時避免了繁瑣的字符串拼接操作。

對比:

Statement ,是每次執(zhí)行一個sql語句,就要把一個完成的sql語句發(fā)送給數(shù)據(jù)庫進行執(zhí)行,然后取回返回的結(jié)果。

PreparedStatement ,可以把一個sql語句的結(jié)構(gòu),提前發(fā)送給數(shù)據(jù)庫進行預(yù)處理,然后在專門給發(fā)送要操作的具體的值,在數(shù)據(jù)量大的時候,這種方式會大大提高執(zhí)行效率。

到此這篇關(guān)于JDBC中Statement的Sql注入問題詳解的文章就介紹到這了,更多相關(guān)Statement的Sql注入問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IntelliJ IDEA配置Maven阿里云鏡像加速源的全流程

    IntelliJ IDEA配置Maven阿里云鏡像加速源的全流程

    國內(nèi)網(wǎng)絡(luò)訪問 Maven 中央倉庫經(jīng)常超時、依賴下載極慢或失敗,配置阿里云等國內(nèi)鏡像后,Java 項目依賴下載飛快,極大提升開發(fā)效率,是中國開發(fā)者必做優(yōu)化,本文就給大家介紹了IntelliJ IDEA配置Maven阿里云鏡像加速源的全流程,需要的朋友可以參考下
    2025-09-09
  • MybatisPlus中的刪除和邏輯刪除及區(qū)別介紹

    MybatisPlus中的刪除和邏輯刪除及區(qū)別介紹

    這篇文章主要介紹了MybatisPlus中的刪除和邏輯刪除的相關(guān)知識,刪除又分為邏輯刪除和物理刪除,那么它們有什么區(qū)別呢?在本文給大家詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧
    2020-08-08
  • 詳解SpringBoot集成Hera日志管理新方案

    詳解SpringBoot集成Hera日志管理新方案

    本文介紹了SpringBoot集成Hera日志平臺的完整方案,SpringBoot與Hera的集成步驟包括環(huán)境準(zhǔn)備、核心參數(shù)配置、無侵入式日志輸出和控制臺高效排查,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • SpringBoot請求處理之常用參數(shù)注解介紹與源碼分析

    SpringBoot請求處理之常用參數(shù)注解介紹與源碼分析

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)請求處理、常用注解和方法參數(shù)的小技巧
    2022-10-10
  • Java?枚舉的定義、使用詳解

    Java?枚舉的定義、使用詳解

    本文介紹了Java中的枚舉(enum)概念,包括枚舉的定義、使用和常用方法,枚舉是一種特殊的類,用于定義一組常量,使得代碼更具有可讀性和可維護性,枚舉類默認(rèn)繼承自java.lang.Enum類,且不能被繼承,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 使用lombok@Data存在extends時需要注意的問題

    使用lombok@Data存在extends時需要注意的問題

    在Java編程中,正確實現(xiàn)equals方法是保證對象比較一致性的關(guān)鍵,使用instanceof檢查類型可能導(dǎo)致違反對稱性原則,即當(dāng)子類和父類都重寫equals時可能出現(xiàn)a.equals(b)不等于b.equals(a)的情況,Lombok的@EqualsAndHashCode注解可以通過callSuper=true參數(shù)
    2024-10-10
  • java實現(xiàn)掃雷游戲控制臺版

    java實現(xiàn)掃雷游戲控制臺版

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)掃雷游戲控制臺版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Java反射與注解的詳細(xì)講解(含代碼)

    Java反射與注解的詳細(xì)講解(含代碼)

    注解和反射應(yīng)該說是后期JAVA開發(fā)里面比較重要的技術(shù)了,通過注解和反射可以簡化許許多多的操作和步驟,最重要的是為JAVA的運行提供了更多的靈活性,這篇文章主要介紹了Java反射與注解的詳細(xì)講解,需要的朋友可以參考下
    2026-06-06
  • springboot整合JPA過程解析

    springboot整合JPA過程解析

    這篇文章主要介紹了springboot整合JPA過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • 深入理解Java原生的序列化機制

    深入理解Java原生的序列化機制

    Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節(jié)序列,該字節(jié)序列包括該對象的數(shù)據(jù)、有關(guān)對象的類型的信息和存儲在對象中數(shù)據(jù)的類型。下面小編和大家來一起學(xué)習(xí)一下吧
    2019-06-06

最新評論

开封县| 毕节市| 馆陶县| 铜川市| 奎屯市| 长乐市| 新密市| 潢川县| 长乐市| 陇西县| 蒙自县| 龙井市| 苏州市| 根河市| 新兴县| 化德县| 唐河县| 赫章县| 临潭县| 抚远县| 大丰市| 蓬莱市| 左贡县| 成安县| 忻州市| 临夏市| 社会| 丁青县| 桑日县| 屏山县| 古蔺县| 新乡市| 兖州市| 邛崃市| 达拉特旗| 胶南市| 河间市| 东城区| 汶川县| 平遥县| 泗水县|