Rumah Java javaTutorial 为什么java jdbc问号占位符可以防注入?

为什么java jdbc问号占位符可以防注入?

Oct 22, 2018 pm 04:18 PM
jdbc pemegang tempat Anti-suntikan

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

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

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

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

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

String sql = "select * from administrator where adminname=?";
psm = con.prepareStatement(sql);
Salin selepas log masuk
String s_name ="zhangsan' or '1'='1";
psm.setString(1, s_name);
Salin selepas log masuk

假设数据库表中并没有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;
	}
}
Salin selepas log masuk

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

Atas ialah kandungan terperinci 为什么java jdbc问号占位符可以防注入?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Selepas Java8 (291), TLS1.1 dilumpuhkan dan JDBC tidak boleh menyambung ke SqlServer2008 menggunakan SSL. Selepas Java8 (291), TLS1.1 dilumpuhkan dan JDBC tidak boleh menyambung ke SqlServer2008 menggunakan SSL. May 16, 2023 pm 11:55 PM

Selepas Java8-291, TLS1.1 dinyahdayakan, supaya JDBC tidak dapat menyambung ke SqlServer2008 menggunakan SSL. Berikut adalah penyelesaian untuk mengubah suai fail java.security jre ia adalah jre, pergi ke {JAVA_HOME}/jre/ Dalam lib/security, sebagai contoh????C:\ProgramFiles\Java\jre1.8.0_301\lib\security Jika ia adalah versi mudah alih bebas pemasangan Eclipse , cari java.security dalam folder pemasangan, seperti????xxx\plugins \org

Bagaimana untuk melaksanakan sisipan kelompok JDBC di Jawa Bagaimana untuk melaksanakan sisipan kelompok JDBC di Jawa May 18, 2023 am 10:02 AM

1. Jelaskan bahawa dalam JDBC, kaedah executeBatch boleh melaksanakan berbilang penyata dml dalam kelompok, dan kecekapan adalah lebih tinggi daripada melaksanakan executeUpdate secara individu Apakah prinsipnya? Bagaimana untuk melaksanakan pelaksanaan batch dalam mysql dan oracle? Artikel ini akan memperkenalkan kepada anda prinsip di sebalik ini. 2. Pengenalan Eksperimen Eksperimen ini akan dijalankan melalui tiga langkah berikut: a. Merekodkan penggunaan masa pelaksanaan batch dan pelaksanaan tunggal jdbc dalam mysql b. c. Catatkan pelaksanaan kumpulan dan pelaksanaan tunggal oracleplsql versi java dan pangkalan data yang memakan masa adalah seperti berikut: Java17, Mysql8, Oracle.

Ralat Java: Ralat JDBC, Cara Menyelesaikan dan Mengelak Ralat Java: Ralat JDBC, Cara Menyelesaikan dan Mengelak Jun 24, 2023 pm 02:40 PM

Dengan aplikasi Java yang meluas, ralat JDBC sering berlaku apabila program Java menyambung ke pangkalan data. JDBC (JavaDatabaseConnectivity) ialah antara muka pengaturcaraan dalam Java yang digunakan untuk menyambung ke pangkalan data Oleh itu, ralat JDBC ialah ralat yang dihadapi apabila program Java berinteraksi dengan pangkalan data. Berikut ialah beberapa ralat JDBC yang paling biasa dan cara menyelesaikan dan mengelakkannya. ClassNotFoundException Ini adalah JDBC yang paling biasa

Bagaimana untuk menganalisis pengaturcaraan JDBC dalam MySQL Bagaimana untuk menganalisis pengaturcaraan JDBC dalam MySQL May 30, 2023 pm 10:19 PM

1. Prasyarat untuk pengaturcaraan pangkalan data Bahasa pengaturcaraan, seperti Java, C, C++, Python dan pangkalan data lain, seperti Oracle, MySQL, SQLServer dan pakej pemacu pangkalan data lain: Pangkalan data yang berbeza menyediakan pakej pemacu pangkalan data yang berbeza yang sepadan dengan bahasa pengaturcaraan yang berbeza : MySQL menyediakan pakej pemacu Java mysql-connector-java, yang diperlukan untuk mengendalikan MySQL berdasarkan Java. Begitu juga, untuk mengendalikan pangkalan data Oracle berdasarkan Java, pakej pemacu pangkalan data Oracle ojdbc diperlukan. 2. Pengaturcaraan pangkalan data Java: JDBCJDBC, JavaDatabaseConnectiv

Masalah biasa yang dihadapi dalam Java menggunakan JDBC API untuk menyambung ke pangkalan data MySQL Masalah biasa yang dihadapi dalam Java menggunakan JDBC API untuk menyambung ke pangkalan data MySQL Jun 10, 2023 am 09:55 AM

Dalam tahun-tahun kebelakangan ini, bahasa Java telah digunakan dengan lebih meluas, dan JDBCAPI ialah kaedah kreatif untuk aplikasi Java untuk berinteraksi dengan pangkalan data JDBC adalah berdasarkan standard sambungan pangkalan data terbuka yang dipanggil ODBC, yang membolehkan aplikasi Java menyambung ke mana-mana pangkalan data sistem pengurusan (DBMS). Antaranya, MySQL ialah sistem pengurusan pangkalan data yang popular. Walau bagaimanapun, pembangun juga akan menghadapi beberapa masalah biasa apabila menyambung ke pangkalan data MySQL Artikel ini bertujuan untuk memperkenalkan sambungan JDBCAPI M

Benteng fungsi: Menyelam jauh ke dalam benteng keselamatan fungsi PHP Benteng fungsi: Menyelam jauh ke dalam benteng keselamatan fungsi PHP Mar 02, 2024 pm 09:28 PM

Fungsi PHP ialah alat berkuasa yang boleh digunakan untuk melaksanakan pelbagai tugas. Walau bagaimanapun, tanpa langkah keselamatan yang betul, mereka juga boleh menjadi vektor serangan. Artikel ini membincangkan kepentingan keselamatan fungsi PHP dan menyediakan amalan terbaik untuk memastikan kod anda selamat daripada serangan. Function Injection Attack Function injection ialah teknik serangan di mana penyerang merampas aliran program dengan menyuntik kod hasad ke dalam panggilan fungsi. Ini boleh membenarkan penyerang untuk melaksanakan kod sewenang-wenangnya, mencuri data sensitif atau menjejaskan sepenuhnya aplikasi. Kod demo: //Kod kerentanan functiongreet($name){return "Hello,$name!";}//Inject kod hasad $name="Bob";echo"Inject

Petua penggunaan ruang letak pemformatan Golang Petua penggunaan ruang letak pemformatan Golang Mar 12, 2024 pm 03:24 PM

Petua untuk menggunakan ruang letak pemformatan Golang Dalam proses menggunakan Golang untuk memformat rentetan, adalah sangat penting untuk menguasai kemahiran menggunakan ruang letak. Artikel ini akan memperkenalkan beberapa ruang letak pemformatan yang biasa digunakan dan kod sampel untuk membantu pembaca mengendalikan tugas pemformatan rentetan dengan lebih fleksibel. Pemformatan ruang letak di Golang terutamanya terdiri daripada % diikuti dengan huruf tertentu, yang menunjukkan output jenis data yang berbeza. Berikut ialah beberapa ruang letak pemformatan yang biasa digunakan dan jenis datanya yang sepadan: %v: pemformatan lalai, mengikut jenis nilai

Apakah perbezaan antara rangka kerja Hibernate dan JDBC? Apakah perbezaan antara rangka kerja Hibernate dan JDBC? Apr 17, 2024 am 10:33 AM

Perbezaan antara Hibernate dan JDBC: Tahap abstraksi: Hibernate menyediakan pemetaan objek peringkat tinggi dan penjanaan pertanyaan, manakala JDBC memerlukan pengekodan manual. Pemetaan hubungan objek: Hibernate memetakan objek Java dan jadual pangkalan data, manakala JDBC tidak menyediakan fungsi ini. Penjanaan pertanyaan: Hibernate menggunakan HQL untuk memudahkan penjanaan pertanyaan, manakala JDBC memerlukan menulis pertanyaan SQL yang kompleks. Pengurusan transaksi: Hibernate menguruskan transaksi secara automatik, manakala JDBC memerlukan pengurusan manual.

See all articles