首頁 Java java教程 為什麼java jdbc問號佔位符可以防注入?

為什麼java jdbc問號佔位符可以防注入?

Oct 22, 2018 pm 04:18 PM
jdbc 佔位符 防注入

本篇文章给大家带来的内容是介绍为什么java jdbc问号占位符可以防注入?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

最近几天探讨一下关于sql注入的问题,以前林老师也讲过,现在总结一下:

其实,like是会注入的,也不建议用,用占位符实际查询效果不是like本身的意思,相当全匹配。

建议使用instr()函数,本文主要记录一下处理防止注入的源码,为什么用?可以防注入,而拼接的sql可以注入。

先看下面用占位符来查询的一句话

String sql = "select * from administrator where adminname=?";
psm = con.prepareStatement(sql);
登入後複製
String s_name ="zhangsan' or '1'='1";
psm.setString(1, s_name);
登入後複製

假设数据库表中并没有zhangsan这个用户名,用plsql运行sql语句,可以查出来所有的用户名,但是在Java中并没有查出任何数据,这是为什么呢?

首先,setString()的源码中只有方法名字,并没有任何过程性处理。

那么答案肯定出现在Java到数据库这个过程中,也就是mysql和oracle驱动包中,在mysql驱动包中,PreparedStatement继承并实现了jdk中的setString方法,翻看一下源码,主要是做了转义处理。

也就是原因在于数据库厂商帮你解决了这个问题,下面就看看这个方法的具体实现:

public void setString(int parameterIndex, String x)
throws SQLException {
	if(x == null) {
		setNull(parameterIndex, 1);
	} else {
		checkClosed();
		int stringLength = x.length();
		if(connection.isNoBackslashEscapesSet()) {
			boolean needsHexEscape = isEscapeNeededForString(x, stringLength);
			if(!needsHexEscape) {
				byte parameterAsBytes[] = null;
				StringBuffer quotedString = new StringBuffer(x.length() + 2);
				quotedString.append('\'');
				quotedString.append(x);
				quotedString.append('\'');
				if(!isLoadDataQuery)
					parameterAsBytes = StringUtils.getBytes(quotedString.toString(), charConverter, charEncoding, connection.getServerCharacterEncoding(), connection.parserKnowsUnicode());
				else
					parameterAsBytes = quotedString.toString().getBytes();
				setInternal(parameterIndex, parameterAsBytes);
			} else {
				byte parameterAsBytes[] = null;
				if(!isLoadDataQuery)
					parameterAsBytes = StringUtils.getBytes(x, charConverter, charEncoding, connection.getServerCharacterEncoding(), connection.parserKnowsUnicode());
				else
					parameterAsBytes = x.getBytes();
				setBytes(parameterIndex, parameterAsBytes);
			}
			return;
		}
		String parameterAsString = x;
		boolean needsQuoted = true;
		if(isLoadDataQuery || isEscapeNeededForString(x, stringLength)) {
			needsQuoted = false;
			StringBuffer buf = new StringBuffer((int)((double) x.length() * 1.1000000000000001 D));
			buf.append('\'');
			for(int i = 0; i < stringLength; i++) {
				char c = x.charAt(i);
				switch(c) {
					case 0: // &#39;\0&#39;
						buf.append(&#39;\\&#39;);
						buf.append(&#39;0&#39;);
						break;
					case 10: // &#39;\n&#39;
						buf.append(&#39;\\&#39;);
						buf.append(&#39;n&#39;);
						break;
					case 13: // &#39;\r&#39;
						buf.append(&#39;\\&#39;);
						buf.append(&#39;r&#39;);
						break;
					case 92: // &#39;\\&#39;
						buf.append(&#39;\\&#39;);
						buf.append(&#39;\\&#39;);
						break;
					case 39: // &#39;\&#39;&#39;
						buf.append(&#39;\\&#39;);
						buf.append(&#39;\&#39;&#39;);
						break;
					case 34: // &#39;"&#39;
						if(usingAnsiMode)
							buf.append(&#39;\\&#39;);
						buf.append(&#39;"&#39;);
						break;
					case 26: // &#39;\032&#39;
						buf.append(&#39;\\&#39;);
						buf.append(&#39;Z&#39;);
						break;
					default:
						buf.append(c);
						break;
				}
			}
			buf.append(&#39;\&#39;&#39;);
			parameterAsString = buf.toString();
		}
		byte parameterAsBytes[] = null;
		if(!isLoadDataQuery) {
			if(needsQuoted)
				parameterAsBytes = StringUtils.getBytesWrapped(parameterAsString, &#39;\&#39;&#39;, &#39;\&#39;&#39;, charConverter, charEncoding, connection.getServerCharacterEncoding(), connection.parserKnowsUnicode());
			else
				parameterAsBytes = StringUtils.getBytes(parameterAsString, charConverter, charEncoding, connection.getServerCharacterEncoding(), connection.parserKnowsUnicode());
		} else {
			parameterAsBytes = parameterAsString.getBytes();
		}
		setInternal(parameterIndex, parameterAsBytes);
		parameterTypes[(parameterIndex - 1) + getParameterIndexOffset()] = 12;
	}
}
登入後複製

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问Java视频教程java开发图文教程bootstrap视频教程

以上是為什麼java jdbc問號佔位符可以防注入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java8(291)之後禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008怎麼解決 Java8(291)之後禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008怎麼解決 May 16, 2023 pm 11:55 PM

Java8-291之後,禁用了TLS1.1,使JDBC無法用SSL連接SqlServer2008怎麼辦,以下是解決辦法修改java.security檔案1.找到jre的java.security檔案如果是jre,在{JAVA_HOME}/jre/ lib/security中,例如????C:\ProgramFiles\Java\jre1.8.0_301\lib\security如果是Eclipse綠色免安裝便攜版在安裝資料夾搜尋java.security,例如?????xxx\plugins \org

Java如何實作JDBC批次插入 Java如何實作JDBC批次插入 May 18, 2023 am 10:02 AM

一、說明在JDBC中,executeBatch這個方法可以將多個dml語句批次執行,效率比單一執行executeUpdate高很多,這是什麼原理呢?在mysql和oracle中又是如何實現批次執行的呢?本文將為大家介紹背後的原理。二、實驗介紹本實驗將透過以下三步驟進行a.記錄jdbc在mysql中批量執行和單條執行的耗時b.記錄jdbc在oracle中批量執行和單條執行的耗時c.記錄oracleplsql批量執行和單條執行的耗時相關java和資料庫版本如下:Java17,Mysql8,Oracl

MySQL中的JDBC程式設計該如何分析 MySQL中的JDBC程式設計該如何分析 May 30, 2023 pm 10:19 PM

一、資料庫程式設計的必備條件程式語言,如Java,C、C++、Python等資料庫,如Oracle,MySQL,SQLServer等資料庫驅動套件:不同的資料庫,對應不同的程式語言提供了不同的資料庫驅動包,如:MySQL提供了Java的驅動包mysql-connector-java,需要基於Java操作MySQL即需要該驅動包。同樣的,要基於Java操作Oracle資料庫則需要Oracle的資料庫驅動包ojdbc。二、Java的資料庫程式設計:JDBCJDBC,即JavaDatabaseConnectiv

Java錯誤:JDBC錯誤,如何解決與避免 Java錯誤:JDBC錯誤,如何解決與避免 Jun 24, 2023 pm 02:40 PM

隨著Java的廣泛應用,Java程式在連接資料庫時經常會出現JDBC錯誤。 JDBC(JavaDatabaseConnectivity)是Java中用於連接資料庫的程式設計接口,因此,JDBC錯誤是在Java程式與資料庫互動時遇到的錯誤。以下將介紹一些最常見的JDBC錯誤及如何解決和避免它們。 ClassNotFoundException這是最常見的JDBC

Java使用JDBC API連接MySQL資料庫遇到的常見問題 Java使用JDBC API連接MySQL資料庫遇到的常見問題 Jun 10, 2023 am 09:55 AM

近年來,Java語言的應用越來越廣泛,而JDBCAPI是Java應用程式中與資料庫互動的一種創意方法,JDBC基於一種名為ODBC的開放資料庫連接標準,使得Java應用程式能夠連接到任何資料庫管理系統(DBMS)。其中,MySQL更是一款備受青睞的資料庫管理系統。然而,連接MySQL資料庫時,開發人員也會遇到一些常見問題,本文旨在介紹JDBCAPI連接M

函數的堡壘:深入 PHP 函數安全性的堡壘 函數的堡壘:深入 PHP 函數安全性的堡壘 Mar 02, 2024 pm 09:28 PM

PHP函數是強大的工具,可用來執行各種任務。但是,如果沒有適當的安全性措施,它們也可能成為攻擊媒介。本文深入探討php函數安全性的重要性,並提供最佳實踐,以確保您的程式碼免受攻擊。函數注入攻擊函數注入是一種攻擊技術,其中攻擊者透過向函數呼叫注入惡意程式碼來劫持程式流程。這可能允許攻擊者執行任意程式碼、竊取敏感資料或完全破壞應用程式。示範程式碼://漏洞程式碼functiongreet($name){return"Hello,$name!";}//注入惡意程式碼$name="Bob";echo"Inject

Golang格式化佔位符使用技巧 Golang格式化佔位符使用技巧 Mar 12, 2024 pm 03:24 PM

Golang格式化佔位符使用技巧在使用Golang進行字串格式化的過程中,掌握好佔位符的使用技巧是非常重要的。本文將介紹一些常用的格式化佔位符以及範例程式碼,幫助讀者更靈活地處理字串格式化任務。 Golang中的格式化佔位符主要由%後面跟上特定的字母組成,表示輸出不同類型的資料。以下是一些常用的格式化佔位符及其對應的資料類型:%v:預設格式化,根據值的類型

Hibernate 框架與 JDBC 的差異是什麼? Hibernate 框架與 JDBC 的差異是什麼? Apr 17, 2024 am 10:33 AM

Hibernate與JDBC的差異:抽象層級:Hibernate提供高階物件映射和查詢生成,而JDBC需要手動編寫程式碼。物件-關聯映射:Hibernate映射Java物件和資料庫表,而JDBC不提供此功能。查詢產生:Hibernate使用HQL簡化查詢生成,而JDBC需要寫複雜的SQL查詢。事務管理:Hibernate自動管理事務,而JDBC需要手動管理。

See all articles