Maison Java javaDidacticiel Pourquoi l'espace réservé au point d'interrogation Java JDBC est-il anti-injection ?

Pourquoi l'espace réservé au point d'interrogation Java JDBC est-il anti-injection ?

Oct 22, 2018 pm 04:18 PM
jdbc espace réservé 防注入

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

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

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

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

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

String sql = "select * from administrator where adminname=?";
psm = con.prepareStatement(sql);
Copier après la connexion
String s_name ="zhangsan' or '1'='1";
psm.setString(1, s_name);
Copier après la connexion

假设数据库表中并没有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;
	}
}
Copier après la connexion

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Après Java8 (291), TLS1.1 est désactivé et JDBC ne peut pas se connecter à SqlServer2008 via SSL. Comment résoudre le problème ? Après Java8 (291), TLS1.1 est désactivé et JDBC ne peut pas se connecter à SqlServer2008 via SSL. Comment résoudre le problème ? May 16, 2023 pm 11:55 PM

Après Java8-291, TLS1.1 est désactivé, de sorte que JDBC ne peut pas se connecter à SqlServer2008 à l'aide de SSL. Que dois-je faire ? Voici la solution pour modifier le fichier java.security 1. Recherchez le fichier java.security de jre. c'est jre, allez dans {JAVA_HOME}/jre/ Dans lib/security, par exemple ????C:\ProgramFiles\Java\jre1.8.0_301\lib\security S'il s'agit de la version portable sans installation verte d'Eclipse. , recherchez java.security dans le dossier d'installation, tel que ????xxx\plugins \org

Comment implémenter l'insertion par lots JDBC en Java Comment implémenter l'insertion par lots JDBC en Java May 18, 2023 am 10:02 AM

1. Expliquez que dans JDBC, la méthode executeBatch peut exécuter plusieurs instructions dml par lots et que l'efficacité est bien supérieure à l'exécution individuelle d'executeUpdate. Quel est le principe ? Comment implémenter l'exécution par lots dans MySQL et Oracle ? Cet article vous présentera le principe derrière cela. 2. Introduction à l'expérience Cette expérience sera réalisée en trois étapes : a. Enregistrer la durée d'exécution par lots de jdbc et d'exécution unique dans MySQL. b. Enregistrer la durée d'exécution par lots de jdbc et d'exécution unique dans Oracle ; Enregistrez l'exécution par lots et l'exécution unique d'oracleplsql. Les versions Java et de base de données associées qui prennent du temps d'exécution sont les suivantes : Java17, Mysql8, Oracle.

Erreurs Java : erreurs JDBC, comment les résoudre et les éviter Erreurs Java : erreurs JDBC, comment les résoudre et les éviter Jun 24, 2023 pm 02:40 PM

Avec l'application répandue de Java, des erreurs JDBC se produisent souvent lorsque les programmes Java se connectent aux bases de données. JDBC (JavaDatabaseConnectivity) est une interface de programmation en Java utilisée pour se connecter à une base de données. Par conséquent, une erreur JDBC est une erreur rencontrée lorsqu'un programme Java interagit avec une base de données. Voici quelques-unes des erreurs JDBC les plus courantes et comment les résoudre et les éviter. ClassNotFoundException C'est le JDBC le plus courant

Comment analyser la programmation JDBC dans MySQL Comment analyser la programmation JDBC dans MySQL May 30, 2023 pm 10:19 PM

1. Conditions préalables à la programmation de bases de données Langages de programmation, tels que Java, C, C++, Python et autres bases de données, telles qu'Oracle, MySQL, SQLServer et d'autres packages de pilotes de base de données : Différentes bases de données fournissent différents packages de pilotes de base de données correspondant à différents langages de programmation. : MySQL fournit le package de pilotes Java mysql-connector-java, qui est requis pour faire fonctionner MySQL basé sur Java. De même, pour faire fonctionner la base de données Oracle basée sur Java, le package de pilotes de base de données Oracle ojdbc est requis. 2. Programmation de bases de données Java : JDBCJDBC, JavaDatabaseConnectiv

Problèmes courants rencontrés en Java lors de l'utilisation de l'API JDBC pour se connecter à la base de données MySQL Problèmes courants rencontrés en Java lors de l'utilisation de l'API JDBC pour se connecter à la base de données MySQL Jun 10, 2023 am 09:55 AM

Ces dernières années, l'application du langage Java est devenue de plus en plus répandue et JDBCAPI est une méthode créative permettant aux applications Java d'interagir avec les bases de données. JDBC est basé sur un standard de connexion de base de données ouvert appelé ODBC, qui permet aux applications Java de se connecter à n'importe quel type de base de données. système de gestion de base de données (SGBD). Parmi eux, MySQL est un système de gestion de bases de données populaire. Cependant, les développeurs rencontreront également des problèmes courants lors de la connexion aux bases de données MySQL. Cet article vise à présenter la connexion JDBCAPI M.

Le bastion des fonctions : une plongée approfondie dans le bastion de la sécurité des fonctions PHP Le bastion des fonctions : une plongée approfondie dans le bastion de la sécurité des fonctions PHP Mar 02, 2024 pm 09:28 PM

Les fonctions PHP sont des outils puissants qui peuvent être utilisés pour effectuer diverses tâches. Cependant, sans mesures de sécurité appropriées, ils peuvent également devenir des vecteurs d’attaques. Cet article explore l'importance de la sécurité des fonctions PHP et fournit les meilleures pratiques pour garantir que votre code est à l'abri des attaques. Attaque par injection de fonction L'injection de fonction est une technique d'attaque dans laquelle un attaquant détourne le flux d'un programme en injectant du code malveillant dans des appels de fonction. Cela pourrait permettre à un attaquant d'exécuter du code arbitraire, de voler des données sensibles ou de compromettre complètement l'application. Code de démonstration : //Code de vulnérabilité functiongreet($name){return "Hello,$name!";}//Injecter du code malveillant $name="Bob";echo"Inject

Conseils d'utilisation des espaces réservés de formatage Golang Conseils d'utilisation des espaces réservés de formatage Golang Mar 12, 2024 pm 03:24 PM

Conseils pour l'utilisation des espaces réservés de formatage Golang Dans le processus d'utilisation de Golang pour formater des chaînes, il est très important de maîtriser les compétences d'utilisation des espaces réservés. Cet article présentera certains espaces réservés de formatage couramment utilisés et des exemples de code pour aider les lecteurs à gérer les tâches de formatage de chaîne de manière plus flexible. Les espaces réservés de formatage dans Golang se composent principalement de % suivis de lettres spécifiques, indiquant la sortie de différents types de données. Voici quelques espaces réservés de formatage couramment utilisés et leurs types de données correspondants : %v : formatage par défaut, en fonction du type de valeur.

Quelle est la différence entre le framework Hibernate et JDBC ? Quelle est la différence entre le framework Hibernate et JDBC ? Apr 17, 2024 am 10:33 AM

Différences entre Hibernate et JDBC : Niveau d'abstraction : Hibernate fournit un mappage d'objets et une génération de requêtes de haut niveau, tandis que JDBC nécessite un codage manuel. Mappage objet-relationnel : Hibernate mappe les objets Java et les tables de base de données, alors que JDBC ne fournit pas cette fonctionnalité. Génération de requêtes : Hibernate utilise HQL pour simplifier la génération de requêtes, tandis que JDBC nécessite l'écriture de requêtes SQL complexes. Gestion des transactions : Hibernate gère automatiquement les transactions, tandis que JDBC nécessite une gestion manuelle.

See all articles