ホームページ 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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

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 である場合は、lib/security の {JAVA_HOME}/jre/ に移動します (例:???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

1. JDBC では、executeBatch メソッドを使用して複数の dml ステートメントをバッチで実行でき、executeUpdate を個別に実行するより効率が高いことを説明します。その原理は何ですか? mysqlとoracleでバッチ実行を実装するにはどうすればよいですか?この記事ではその原理を紹介します。 2. 実験の導入 この実験は、次の 3 つの手順で実行されます: a. mysql で jdbc バッチ実行と単一実行にかかる時間を記録する; b. oracle で jdbc バッチ実行と単一実行にかかる時間を記録する; c. jdbc バッチ実行と単一実行にかかる時間を記録するoracleplsql のバッチ実行と単一実行を記録します。実行に時間がかかる関連する Java およびデータベースのバージョンは次のとおりです: Java17、Mysql8、Oracle

Java エラー: JDBC エラー、解決方法と回避方法 Java エラー: JDBC エラー、解決方法と回避方法 Jun 24, 2023 pm 02:40 PM

Java のアプリケーションが広く普及しているため、Java プログラムがデータベースに接続するときに JDBC エラーが発生することがよくあります。 JDBC (JavaDatabaseConnectivity) は、データベースへの接続に使用される Java のプログラミング インターフェイスです。したがって、JDBC エラーは、Java プログラムがデータベースと対話するときに発生するエラーです。ここでは、最も一般的な JDBC エラーのいくつかと、それらを解決および回避する方法を示します。 ClassNotFoundException これは最も一般的な JDBC です

MySQL で JDBC プログラミングを分析する方法 MySQL で JDBC プログラミングを分析する方法 May 30, 2023 pm 10:19 PM

1. データベース プログラミングの前提条件 プログラミング言語 (Java、C、C++、Python など)、およびその他のデータベース (Oracle、MySQL、SQLServer など)、およびその他のデータベース ドライバー パッケージ: データベースが異なれば、プログラミング言語に対応するデータベース ドライバー パッケージも異なります。 : MySQL は、Java ベースで MySQL を動作させるために必要な Java ドライバー パッケージ mysql-connector-java を提供します。同様に、Java ベースで Oracle データベースを動作させるには、Oracle のデータベース ドライバー パッケージ ojdbc が必要です。 2. Java データベース プログラミング: JDBCJDBC、JavaDatabaseConnectiv

JDBC API を使用して MySQL データベースに接続する Java で発生する一般的な問題 JDBC API を使用して MySQL データベースに接続する Java で発生する一般的な問題 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