Heim Java javaLernprogramm Warum ist der Java-JDBC-Fragezeichen-Platzhalter Anti-Injection?

Warum ist der Java-JDBC-Fragezeichen-Platzhalter Anti-Injection?

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);
Nach dem Login kopieren
String s_name ="zhangsan' or '1'='1";
psm.setString(1, s_name);
Nach dem Login kopieren

假设数据库表中并没有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;
	}
}
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonWarum ist der Java-JDBC-Fragezeichen-Platzhalter Anti-Injection?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Nach Java8 (291) ist TLS1.1 deaktiviert und JDBC kann keine Verbindung zu SqlServer2008 über SSL herstellen. Wie kann das Problem gelöst werden? Nach Java8 (291) ist TLS1.1 deaktiviert und JDBC kann keine Verbindung zu SqlServer2008 über SSL herstellen. Wie kann das Problem gelöst werden? May 16, 2023 pm 11:55 PM

Nach Java8-291 ist TLS1.1 deaktiviert, sodass JDBC keine Verbindung zu SqlServer2008 über SSL herstellen kann. Was soll ich tun? es ist jre, gehen Sie zu {JAVA_HOME}/jre/ In lib/security, zum Beispiel????C:\ProgramFiles\Java\jre1.8.0_301\lib\security Wenn es sich um die grüne, installationsfreie tragbare Version von Eclipse handelt , suchen Sie im Installationsordner nach java.security, z. B.????xxx\plugins \org

So implementieren Sie JDBC-Batch-Insert in Java So implementieren Sie JDBC-Batch-Insert in Java May 18, 2023 am 10:02 AM

1. Erklären Sie, dass in JDBC die Methode „executeBatch“ mehrere DML-Anweisungen stapelweise ausführen kann und die Effizienz viel höher ist als die einzelne Ausführung von „executeUpdate“. Wie implementiert man die Batch-Ausführung in MySQL und Oracle? Dieser Artikel stellt Ihnen das Prinzip dahinter vor. 2. Einführung in das Experiment Dieses Experiment wird in den folgenden drei Schritten durchgeführt: a. Zeichnen Sie den Zeitaufwand für die Stapelausführung und Einzelausführung von JDBC in Oracle auf. c. Zeichnen Sie die Batch-Ausführung und die Einzelausführung von Oracleplsql auf. Die ausführungsaufwändigen Java- und Datenbankversionen sind wie folgt: Java17, Mysql8, Oracle

Java-Fehler: JDBC-Fehler, wie man sie löst und vermeidet Java-Fehler: JDBC-Fehler, wie man sie löst und vermeidet Jun 24, 2023 pm 02:40 PM

Durch die weit verbreitete Anwendung von Java treten häufig JDBC-Fehler auf, wenn Java-Programme eine Verbindung zu Datenbanken herstellen. JDBC (JavaDatabaseConnectivity) ist eine Programmierschnittstelle in Java, die zum Herstellen einer Verbindung zu einer Datenbank verwendet wird. Daher ist ein JDBC-Fehler ein Fehler, der auftritt, wenn ein Java-Programm mit einer Datenbank interagiert. Hier sind einige der häufigsten JDBC-Fehler und wie man sie löst und vermeidet. ClassNotFoundException Dies ist die häufigste JDBC-Ausnahme

So analysieren Sie die JDBC-Programmierung in MySQL So analysieren Sie die JDBC-Programmierung in MySQL May 30, 2023 pm 10:19 PM

1. Voraussetzungen für die Datenbankprogrammierung Programmiersprachen wie Java, C, C++, Python und andere Datenbanken wie Oracle, MySQL, SQLServer und andere Datenbanktreiberpakete: Verschiedene Datenbanken stellen beispielsweise unterschiedliche Datenbanktreiberpakete bereit, die verschiedenen Programmiersprachen entsprechen : MySQL stellt das Java-Treiberpaket mysql-connector-java zur Verfügung, das für den Betrieb von MySQL auf Java-Basis erforderlich ist. Ebenso ist für den Betrieb einer auf Java basierenden Oracle-Datenbank das Datenbanktreiberpaket ojdbc von Oracle erforderlich. 2. Java-Datenbankprogrammierung: JDBCJDBC, JavaDatabaseConnectiv

Häufige Probleme, die in Java bei der Verwendung der JDBC-API zum Herstellen einer Verbindung zur MySQL-Datenbank auftreten Häufige Probleme, die in Java bei der Verwendung der JDBC-API zum Herstellen einer Verbindung zur MySQL-Datenbank auftreten Jun 10, 2023 am 09:55 AM

In den letzten Jahren hat sich die Anwendung der Java-Sprache immer weiter verbreitet, und JDBCAPI ist eine kreative Methode für Java-Anwendungen zur Interaktion mit Datenbanken. JDBC basiert auf einem offenen Datenbankverbindungsstandard namens ODBC, der es Java-Anwendungen ermöglicht, eine Verbindung zu beliebigen Datenbanken herzustellen Datenbank. Managementsystem (DBMS). Unter ihnen ist MySQL ein beliebtes Datenbankverwaltungssystem. Allerdings werden Entwickler auch auf einige häufige Probleme stoßen, wenn sie eine Verbindung zu MySQL-Datenbanken herstellen. Dieser Artikel zielt darauf ab, die JDBCAPI-Verbindung M vorzustellen

Die Bastion der Funktionen: Ein tiefer Einblick in die Bastion der PHP-Funktionssicherheit Die Bastion der Funktionen: Ein tiefer Einblick in die Bastion der PHP-Funktionssicherheit Mar 02, 2024 pm 09:28 PM

PHP-Funktionen sind leistungsstarke Werkzeuge, mit denen sich vielfältige Aufgaben ausführen lassen. Ohne angemessene Sicherheitsmaßnahmen können sie jedoch auch zu Angriffsvektoren werden. Dieser Artikel befasst sich mit der Bedeutung der PHP-Funktionssicherheit und bietet Best Practices, um sicherzustellen, dass Ihr Code vor Angriffen geschützt ist. Function-Injection-Angriff Function-Injection ist eine Angriffstechnik, bei der ein Angreifer den Programmfluss kapert, indem er bösartigen Code in Funktionsaufrufe einschleust. Dies könnte es einem Angreifer ermöglichen, beliebigen Code auszuführen, sensible Daten zu stehlen oder die Anwendung vollständig zu kompromittieren. Democode: //Sicherheitslückencode functiongreet($name){return „Hello,$name!“;}//Inject bösartiger Code $name="Bob";echo"Inject

Tipps zur Verwendung von Golang-Formatierungsplatzhaltern Tipps zur Verwendung von Golang-Formatierungsplatzhaltern Mar 12, 2024 pm 03:24 PM

Tipps zur Verwendung von Golang-Formatierungsplatzhaltern Bei der Verwendung von Golang zum Formatieren von Zeichenfolgen ist es sehr wichtig, die Fähigkeiten im Umgang mit Platzhaltern zu beherrschen. In diesem Artikel werden einige häufig verwendete Formatierungsplatzhalter und Beispielcode vorgestellt, um Lesern dabei zu helfen, Aufgaben zur Zeichenfolgenformatierung flexibler zu handhaben. Formatierungsplatzhalter in Golang bestehen hauptsächlich aus % gefolgt von bestimmten Buchstaben, die die Ausgabe verschiedener Datentypen angeben. Im Folgenden sind einige häufig verwendete Formatierungsplatzhalter und ihre entsprechenden Datentypen aufgeführt: %v: Standardformatierung, je nach Werttyp

Was ist der Unterschied zwischen dem Hibernate-Framework und JDBC? Was ist der Unterschied zwischen dem Hibernate-Framework und JDBC? Apr 17, 2024 am 10:33 AM

Unterschiede zwischen Hibernate und JDBC: Abstraktionsebene: Hibernate bietet Objektzuordnung und Abfragegenerierung auf hoher Ebene, während JDBC manuelle Codierung erfordert. Objektrelationale Zuordnung: Hibernate bildet Java-Objekte und Datenbanktabellen ab, während JDBC diese Funktionalität nicht bereitstellt. Abfragegenerierung: Hibernate verwendet HQL, um die Abfragegenerierung zu vereinfachen, während JDBC das Schreiben komplexer SQL-Abfragen erfordert. Transaktionsverwaltung: Hibernate verwaltet Transaktionen automatisch, während JDBC eine manuelle Verwaltung erfordert.

See all articles