真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java的jdbc問(wèn)號(hào)占位符可以防止注入嗎

java的jdbc問(wèn)號(hào)占位符可以防止注入嗎?如果你剛好也有這個(gè)困惑,不妨參照這篇文章。閱讀完整文相信大家對(duì)java的占位符有了一定的認(rèn)識(shí)。

創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè)|網(wǎng)頁(yè)維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋成都塑料袋等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身建設(shè)品質(zhì)網(wǎng)站。

其實(shí),like是會(huì)注入的,也不建議用,用占位符實(shí)際查詢效果不是like本身的意思,相當(dāng)全匹配。

建議使用instr()函數(shù),本文主要記錄一下處理防止注入的源碼,為什么用?可以防注入,而拼接的sql可以注入。

先看下面用占位符來(lái)查詢的一句話

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

假設(shè)數(shù)據(jù)庫(kù)表中并沒(méi)有zhangsan這個(gè)用戶名,用plsql運(yùn)行sql語(yǔ)句,可以查出來(lái)所有的用戶名,但是在Java中并沒(méi)有查出任何數(shù)據(jù),這是為什么呢?

首先,setString()的源碼中只有方法名字,并沒(méi)有任何過(guò)程性處理。

那么答案肯定出現(xiàn)在Java到數(shù)據(jù)庫(kù)這個(gè)過(guò)程中,也就是MySQL和oracle驅(qū)動(dòng)包中,在mysql驅(qū)動(dòng)包中,PreparedStatement繼承并實(shí)現(xiàn)了jdk中的setString方法,翻看一下源碼,主要是做了轉(zhuǎn)義處理。

也就是原因在于數(shù)據(jù)庫(kù)廠商幫你解決了這個(gè)問(wèn)題,下面就看看這個(gè)方法的具體實(shí)現(xiàn):

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;
	}
}

關(guān)于java的jdbc問(wèn)號(hào)占位符就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


文章標(biāo)題:java的jdbc問(wèn)號(hào)占位符可以防止注入嗎
分享網(wǎng)址:http://weahome.cn/article/jphjjp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部