91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java的jdbc問號占位符可以防止注入嗎

發布時間:2020-06-15 10:09:02 來源:億速云 閱讀:473 作者:Leah 欄目:編程語言

java的jdbc問號占位符可以防止注入嗎?如果你剛好也有這個困惑,不妨參照這篇文章。閱讀完整文相信大家對java的占位符有了一定的認識。

其實,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的jdbc問號占位符就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

固阳县| 廉江市| 白朗县| 高邮市| 阳泉市| 巨野县| 西和县| 扶余县| 九龙县| 商南县| 黔西| 深泽县| 温宿县| 高陵县| 淮阳县| 沂水县| 安达市| 延安市| 哈尔滨市| 密山市| 壶关县| 重庆市| 漳州市| 泽库县| 南昌市| 新化县| 元谋县| 扬中市| 颍上县| 连平县| 和政县| 浮山县| 二连浩特市| 云霄县| 醴陵市| 公主岭市| 铁力市| 成安县| 紫云| 巴东县| 青岛市|