Java 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: // '\0' buf.append('\\'); buf.append('0'); break; case 10: // '\n' buf.append('\\'); buf.append('n'); break; case 13: // '\r' buf.append('\\'); buf.append('r'); break; case 92: // '\\' buf.append('\\'); buf.append('\\'); break; case 39: // '\'' buf.append('\\'); buf.append('\''); break; case 34: // '"' if(usingAnsiMode) buf.append('\\'); buf.append('"'); break; case 26: // '\032' buf.append('\\'); buf.append('Z'); break; default: buf.append(c); break; } } buf.append('\''); parameterAsString = buf.toString(); } byte parameterAsBytes[] = null; if(!isLoadDataQuery) { if(needsQuoted) parameterAsBytes = StringUtils.getBytesWrapped(parameterAsString, '\'', '\'', 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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











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)

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

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

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

近年、Java 言語のアプリケーションはますます普及しており、JDBCAPI は、Java アプリケーションがデータベースと対話するための独創的な方法です。JDBC は、ODBC と呼ばれるオープン データベース接続標準に基づいており、Java アプリケーションは任意のデータベースに接続できます。データベース管理システム (DBMS)。その中でも、MySQL は人気のあるデータベース管理システムです。ただし、開発者は、MySQL データベースに接続するときに、いくつかの一般的な問題に遭遇することもあります。この記事は、JDBCAPI 接続 M を紹介することを目的としています。

PHP 関数は、さまざまなタスクの実行に使用できる強力なツールです。ただし、適切なセキュリティ対策がなければ、攻撃ベクトルとなる可能性もあります。この記事では、PHP 関数のセキュリティの重要性について詳しく説明し、コードが攻撃から安全であることを保証するためのベスト プラクティスを提供します。関数インジェクション攻撃 関数インジェクションは、攻撃者が関数呼び出しに悪意のあるコードを挿入することによってプログラム フローをハイジャックする攻撃手法です。これにより、攻撃者が任意のコードを実行したり、機密データを盗んだり、アプリケーションを完全に侵害したりする可能性があります。デモ コード: //脆弱性コード functiongreet($name){return "Hello,$name!";}//悪意のあるコードを挿入 $name="Bob";echo"Inject

Golang の書式設定プレースホルダーを使用するためのヒント Golang を使用して文字列を書式設定するプロセスでは、プレースホルダーの使用スキルを習得することが非常に重要です。この記事では、読者が文字列の書式設定タスクをより柔軟に処理できるように、一般的に使用される書式設定のプレースホルダーとサンプル コードをいくつか紹介します。 Golang の書式設定プレースホルダーは、主に % とそれに続く特定の文字で構成され、さまざまな種類のデータの出力を示します。以下は、一般的に使用される書式設定プレースホルダーとそれらに対応するデータ型です: %v: 値の種類に応じたデフォルトの書式設定

Hibernate と JDBC の違い: 抽象化レベル: Hibernate は高レベルのオブジェクト マッピングとクエリ生成を提供しますが、JDBC では手動コーディングが必要です。オブジェクト リレーショナル マッピング: Hibernate は Java オブジェクトとデータベース テーブルをマップしますが、JDBC はこの機能を提供しません。クエリの生成: Hibernate は HQL を使用してクエリの生成を簡素化しますが、JDBC では複雑な SQL クエリを作成する必要があります。トランザクション管理: Hibernate はトランザクションを自動的に管理しますが、JDBC は手動で管理する必要があります。
