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

java中PreparedStatement和Statement詳細講解

 更新時間:2019年11月13日 10:53:51   作者:lay500  
這篇文章主要介紹了java中PreparedStatement和Statement詳細講解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

大家都知道PreparedStatement對象可以防止sql注入,而Statement不能防止sql注入,那么大家知道為什么PreparedStatement對象可以防止sql注入,接下來看我的案例大家就會明白了!

我用的是mysql數(shù)據(jù)庫,以admin表為例子,如下圖:

最后面有具體的java代碼和sql代碼案例

最終執(zhí)行的sql語句打印出來是SELECT * FROM admin WHERE username = '韋小寶' AND password = '222\' OR \'8\'=\'8'

從以上截圖就能看出來,由此可見,prepareStatement對象防止sql注入的方式是把用戶非法輸入的單引號用\反斜杠做了轉義,從而達到了防止sql注入的目的

Statement對象就沒那么好心了,它才不會把用戶非法輸入的單引號用\反斜杠做轉義呢!

PreparedStatement可以有效防止sql注入,所以生產環(huán)境上一定要使用PreparedStatement,而不能使用Statement

當然啦,你可以仔細研究下PreparedStatement對象是如何防止sql注入的,我自己把最終執(zhí)行的sql語句打印出來了,看到打印出來的sql語句就明白了,原來是mysql數(shù)據(jù)庫產商,在實現(xiàn)PreparedStatement接口的實現(xiàn)類中的setString(int parameterIndex, String x)函數(shù)中做了一些處理,把單引號做了轉義(只要用戶輸入的字符串中有單引號,那mysql數(shù)據(jù)庫產商的setString()這個函數(shù),就會把單引號做轉義)

大家有興趣可以去網上,下載一份mysql數(shù)據(jù)庫的驅動程序的源代碼,看看mysql數(shù)據(jù)庫產商的驅動程序的源代碼,去源代碼中找到setString(int parameterIndex, String x)函數(shù),看看該函數(shù)中是怎么寫的,我沒有下載mysql數(shù)據(jù)庫產商的驅動程序的源代碼,而是把mysql數(shù)據(jù)庫的驅動程序jar包解壓了,找到了PreparedStatement.class文件,利用反編譯工具,反編譯了一下,如下:

這下大家應該知道PreparedStatement是如何防止sql注入的了吧

像222' OR '8'='8這樣的sql注入還算溫柔了,有些更可惡的用戶,他們輸入的非法的值是delete from tableName或truncate table tableName 這是十分危險的,更有甚者傳入drop table tableName;有些數(shù)據(jù)庫是不會讓你成功的,但也有很多數(shù)據(jù)庫就可以使這些語句執(zhí)行,所以生產環(huán)境上一定要使用PreparedStatement,而不能使用Statement

下面再舉幾個例子,看截圖

最終打印SELECT * FROM admin WHERE username = '韋小寶' AND password = '\'; DROP TABLE tableName;#'

最終打印SELECT * FROM admin WHERE username = '韋小寶' AND password = '\'; delete from tableName;#'

最終打印SELECT * FROM admin WHERE username = '韋小寶' AND password = '\'; truncate table tableName;#'

下面是java代碼和sql語句,供大家參考,主要是為了測試PreparedStatement對象,所以java代碼寫的比較粗略,大家湊合著看吧!

package com.test;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
/*
 * 研究PreparedStatement是如何防止sql注入的,我分析了一下,原來是mysql數(shù)據(jù)庫產商,在實
 * 現(xiàn)PreparedStatement接口的實現(xiàn)類中的setString(int parameterIndex, String x)函
 * 數(shù)中做了一些處理,把單引號做了轉義(只要用戶輸入的字符串中有單引號,那mysql數(shù)據(jù)庫產商的setString()這個函
 * 數(shù),就會把單引號做轉義)
 */
public class TestConnMySql2 {
 
	public static void main(String[] args) {
		String connStr = "jdbc:mysql://localhost:3306/girls";
//		String sql = "select * from admin";
		String sql = "SELECT * FROM admin WHERE username = ? AND password = ?";
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection connection = DriverManager.getConnection(connStr, "root", "root");
			System.out.println("數(shù)據(jù)庫連接=" + connection);
			//Statement無法防止sql注入
//			Statement stmt = connection.createStatement();
	//PreparedStatement可以有效防止sql注入,所以生產環(huán)境上一定要使用PreparedStatement,而不能使用Statement
			PreparedStatement prepareStatement = connection.prepareStatement(sql);
			prepareStatement.setString(1, "韋小寶");
			//模擬用戶輸入正常的值
//			prepareStatement.setString(2, "222");
			//測試sql注入(模擬用戶輸入非法的值)
			prepareStatement.setString(2, "222' OR '8'='8");
			/*
			 *上面那種的sql注入還算溫柔了,有些更可惡的用戶,他們輸入的非
			 *法的值是delete from tableName或truncate table tableName 這是十分危險的,
			 * 更有甚者傳入drop table tableName;有些數(shù)據(jù)庫是不會讓你成功的,但也有很多數(shù)
			 * 據(jù)庫就可以使這些語句執(zhí)行,所以生產環(huán)境上一定要使用PreparedStatement,而不能使用Statement
			 */
			//測試sql注入(模擬用戶輸入非法的值)在mysql中#井號表示單行注釋(這是mysql中的基礎知識,我就不贅述了)
//			prepareStatement.setString(2, "'; DROP TABLE tableName;#");
			//測試sql注入(模擬用戶輸入非法的值)
//			prepareStatement.setString(2, "'; delete from tableName;#");
			//測試sql注入(模擬用戶輸入非法的值)
//			prepareStatement.setString(2, "'; truncate table tableName;#");
			
			ResultSet rs = prepareStatement.executeQuery();
			System.out.println("sql=" + prepareStatement.toString());
			int col = rs.getMetaData().getColumnCount();
			System.out.println("============================");
			while (rs.next()) {
				for (int i = 1; i <= col; i++) {
					System.out.print(rs.getString(i) + "\t");
					if ((i == 2) && (rs.getString(i).length() < 8)) {
						System.out.print("\t");
					}
				}
				System.out.println("");
			}
			System.out.println("============================");
			rs.close();
			prepareStatement.close();
			connection.close();
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
 
	}
 
}
#用戶輸入正常合法的值
SELECT * FROM admin WHERE username = '韋小寶' AND `password` = '222';
#用戶輸入正常合法的值
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = '222';
 
#sql注入(用戶輸入非法的值)使用Statement對象,無法防止sql注入(會查詢出表的所有數(shù)據(jù))
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = '222' OR '8'='8'
#sql注入(用戶輸入非法的值)使用PreparedStatement對象,可以有效防止sql注入
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = '222\' OR \'8\'=\'8'
 
#sql注入(用戶輸入非法的值)使用Statement對象,無法防止sql注入(DROP操作很危險)
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = ''; DROP TABLE tableName;#'
#sql注入(用戶輸入非法的值)使用PreparedStatement對象,可以有效防止sql注入
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = '\'; DROP TABLE tableName;#'
 
#sql注入(用戶輸入非法的值)使用Statement對象,無法防止sql注入(TRUNCATE操作很危險)
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = ''; TRUNCATE TABLE tableName;#'
#sql注入(用戶輸入非法的值)使用PreparedStatement對象,可以有效防止sql注入
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = '\'; truncate table tableName;#'
 
#sql注入(用戶輸入非法的值)使用Statement對象,無法防止sql注入(DELETE操作很危險)
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = ''; DELETE FROM tableName;#'
#sql注入(用戶輸入非法的值)使用PreparedStatement對象,可以有效防止sql注入
SELECT * FROM admin WHERE username = '韋小寶' AND PASSWORD = '\'; delete from tableName;#'
 
#所以生產環(huán)境上一定要使用PreparedStatement,而不能使用Statement
 
/*
順便復習一下mysql中的3種注釋,我是多行注釋
*/
 
#我是單行注釋
 
-- 我也是單行注釋(注意:-- 這種注釋,后面必須要加一個空格,否則語法報錯)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 基于SSM實現(xiàn)學生管理系統(tǒng)

    基于SSM實現(xiàn)學生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了基于SSM實現(xiàn)學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 解決mybatis無法給帶有下劃線屬性賦值問題

    解決mybatis無法給帶有下劃線屬性賦值問題

    這篇文章主要介紹了解決mybatis無法給帶有下劃線屬性賦值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java對數(shù)器的使用講解

    Java對數(shù)器的使用講解

    今天小編就為大家分享一篇關于Java對數(shù)器的使用講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java中Map接口常用的方法解讀

    java中Map接口常用的方法解讀

    這篇文章主要介紹了java中Map接口常用的方法解讀,Map接口是雙列集合,它的每一個元素都包含一個鍵對象key和值對象Value,鍵和值對象之間存在一種對應關系,稱為映射,需要的朋友可以參考下
    2024-01-01
  • idea pom導入net.sf.json的jar包失敗的解決方案

    idea pom導入net.sf.json的jar包失敗的解決方案

    JSON(JavaScript Object Notation,JS對象簡譜)是一種輕量級的數(shù)據(jù)交換格式,這篇文章主要介紹了idea pom導入net.sf.json的jar包失敗的解決方案,感興趣的朋友一起看看吧
    2023-11-11
  • 基于Zookeeper實現(xiàn)分布式鎖詳解

    基于Zookeeper實現(xiàn)分布式鎖詳解

    Zookeeper是一個分布式的,開源的分布式應用程序協(xié)調服務,是Hadoop和hbase的重要組件。這篇文章主要介紹了通過Zookeeper實現(xiàn)分布式鎖,感興趣的朋友可以了解一下
    2021-12-12
  • java基礎詳解之數(shù)據(jù)類型知識點總結

    java基礎詳解之數(shù)據(jù)類型知識點總結

    這篇文章主要介紹了java基礎詳解之數(shù)據(jù)類型知識點總結,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-04-04
  • 解決rror updating database.Cause:java.sql.SQLSyntaxErrorException問題

    解決rror updating database.Cause:java.sql.SQLSyntaxE

    這篇文章主要介紹了解決rror updating database.Cause:java.sql.SQLSyntaxErrorException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析

    基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析

    這篇文章主要介紹了基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 詳解Spring Boot中使用@Scheduled創(chuàng)建定時任務

    詳解Spring Boot中使用@Scheduled創(chuàng)建定時任務

    本篇文章中主要介紹了Spring Boot中使用@Scheduled創(chuàng)建定時任務,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03

最新評論

荔浦县| 安溪县| 横峰县| 淮滨县| 理塘县| 交城县| 普兰县| 扎赉特旗| 大安市| 金沙县| 嘉善县| 崇文区| 忻城县| 安西县| 娱乐| 仪征市| 林周县| 辽宁省| 淮安市| 娄底市| 常宁市| 卫辉市| 曲阜市| 五华县| 祁东县| 定州市| 沽源县| 蓝山县| 托克托县| 洛南县| 东源县| 壶关县| 张家界市| 保亭| 寿光市| 防城港市| 通州区| 商河县| 靖安县| 三河市| 巢湖市|