mysql 통신 메시지 구조
类型 | 名字 | 描述 |
---|---|---|
int | payload长度 | 按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头 |
int | 序列号 | |
string | payload | 报文体,长度即为前面指定的payload长度 |
ResultsetRow 패키지
Payload
if(NULL){ 0xfb }else{ Protocol::LengthEncodedString }
ResultsetRow 패키지 클래스
public class ResultsetRowPacket extends MySQLPacket { private static final byte NULL_MARK = (byte) 251; public int columnCount; public List<byte[]> columnValues; public ResultsetRowPacket() { } public ResultsetRowPacket(int columnCount) { this.columnCount = columnCount; } @Override public void read(byte[] data) { MySQLMessage mm = new MySQLMessage(data); packetLength = mm.readUB3(); packetId = mm.read(); for (int i = 0; i < columnCount; i++) { columnValues.add(mm.readBytesWithLength()); } } @Override public void write(ByteBuffer buffer) { BufferUtil.writeUB3(buffer, calcPacketSize()); buffer.put(packetId); for (int i = 0; i < columnCount; i++) { byte[] fv = columnValues.get(i); if (fv == null) { buffer.put(NULL_MARK); } else { BufferUtil.writeLength(buffer, fv.length); buffer.put(fv); } } } @Override public int calcPacketSize() { int size = 0; for (int i = 0; i < columnCount; i++) { byte[] v = columnValues.get(i); size += (v == null || v.length == 0) ? 1 : BufferUtil.getLength(v); } return size; } @Override protected String getPacketInfo() { return "MySQL Resultset Row Packet"; } }
ColumnDefinition 패키지
페이로드
lenenc_str catalog lenenc_str schema lenenc_str table lenenc_str org_table lenenc_str name lenenc_str org_name lenenc_int length of fixed-length fields [0c] 2 character set 4 column length 1 type 2 flags 1 decimals 2 filler [00] [00] if command was COM_FIELD_LIST { lenenc_int length of default-values string[$len] default values }
ColumnCount 패키지 클래스
public class ColumnDefinitionPacket extends MySQLPacket { private static final byte[] DEFAULT_CATALOG = "def".getBytes(); private static final byte NEXT_LENGTH = 0x0c; private static final byte[] FILLER = { 00, 00 }; public byte[] catalog = DEFAULT_CATALOG;// always "def" public byte[] schema; public byte[] table; public byte[] orgTable; public byte[] name; public byte[] orgName; public byte nextLength = NEXT_LENGTH;// always 0x0c public int charsetSet; public long length; public int type; public int flags; public byte decimals; public byte[] filler = FILLER; public byte[] defaultValues; public void read(byte[] data) { MySQLMessage mm = new MySQLMessage(data); this.packetLength = mm.readUB3(); this.packetId = mm.read(); this.catalog = mm.readBytesWithLength(); this.schema = mm.readBytesWithLength(); this.table = mm.readBytesWithLength(); this.orgTable = mm.readBytesWithLength(); this.name = mm.readBytesWithLength(); this.orgName = mm.readBytesWithLength(); this.nextLength = mm.read(); this.charsetSet = mm.readUB2(); this.length = mm.readUB4(); this.type = mm.read() & 0xff; this.flags = mm.readUB2(); this.decimals = mm.read(); this.filler = mm.readBytes(2); if (mm.hasRemaining()) { this.defaultValues = mm.readBytesWithLength(); } } @Override public void write(ByteBuffer buffer) { int size = calcPacketSize(); BufferUtil.writeUB3(buffer, size); buffer.put(packetId); BufferUtil.writeWithLength(buffer, catalog, (byte) 0); BufferUtil.writeWithLength(buffer, schema, (byte) 0); BufferUtil.writeWithLength(buffer, table, (byte) 0); BufferUtil.writeWithLength(buffer, orgTable, (byte) 0); BufferUtil.writeWithLength(buffer, name, (byte) 0); BufferUtil.writeWithLength(buffer, orgName, (byte) 0); buffer.put(NEXT_LENGTH); BufferUtil.writeUB2(buffer, charsetSet); BufferUtil.writeUB4(buffer, length); buffer.put((byte) (type & 0xff)); BufferUtil.writeUB2(buffer, flags); buffer.put(decimals); buffer.put(FILLER); if (defaultValues != null) { //only use for show columns BufferUtil.writeWithLength(buffer, defaultValues); } } @Override public int calcPacketSize() { int size = (catalog == null ? 1 : BufferUtil.getLength(catalog)); size += (schema == null ? 1 : BufferUtil.getLength(schema)); size += (table == null ? 1 : BufferUtil.getLength(table)); size += (orgTable == null ? 1 : BufferUtil.getLength(orgTable)); size += (name == null ? 1 : BufferUtil.getLength(name)); size += (orgName == null ? 1 : BufferUtil.getLength(orgName)); size += 13; if (defaultValues != null) { size += BufferUtil.getLength(defaultValues); } return size; } @Override protected String getPacketInfo() { return "MySQL Column Definition Packet"; } }
ColumnCount 패키지
페이로드
Protocol::LengthEncodedInteger
ColumnCount 패키지 클래스
public class ColumnCountPacket extends MySQLPacket { public int columnCount; public void read(byte[] data) { MySQLMessage mm = new MySQLMessage(data); this.packetLength = mm.readUB3(); this.packetId = mm.read(); this.columnCount = (int) mm.readLength(); } @Override public void write(ByteBuffer buffer) { int size = calcPacketSize(); BufferUtil.writeUB3(buffer, size); buffer.put(packetId); BufferUtil.writeLength(buffer, columnCount); } @Override public int calcPacketSize() { int size = BufferUtil.getLength(columnCount); return size; } @Override protected String getPacketInfo() { return "MySQL Column Count Packet"; } }

이 기사는 MySQL의 Alter Table 문을 사용하여 열 추가/드롭 테이블/열 변경 및 열 데이터 유형 변경을 포함하여 테이블을 수정하는 것에 대해 설명합니다.

기사는 인증서 생성 및 확인을 포함하여 MySQL에 대한 SSL/TLS 암호화 구성에 대해 설명합니다. 주요 문제는 자체 서명 인증서의 보안 영향을 사용하는 것입니다. [문자 수 : 159]

기사는 MySQL에서 파티셔닝, 샤딩, 인덱싱 및 쿼리 최적화를 포함하여 대규모 데이터 세트를 처리하기위한 전략에 대해 설명합니다.

기사는 MySQL Workbench 및 Phpmyadmin과 같은 인기있는 MySQL GUI 도구에 대해 논의하여 초보자 및 고급 사용자를위한 기능과 적합성을 비교합니다. [159 자].

이 기사에서는 Drop Table 문을 사용하여 MySQL에서 테이블을 떨어 뜨리는 것에 대해 설명하여 예방 조치와 위험을 강조합니다. 백업 없이는 행동이 돌이킬 수 없으며 복구 방법 및 잠재적 생산 환경 위험을 상세하게합니다.

기사는 외국 열쇠를 사용하여 데이터베이스의 관계를 나타내고 모범 사례, 데이터 무결성 및 피할 수있는 일반적인 함정에 중점을 둡니다.

이 기사에서는 PostgreSQL, MySQL 및 MongoDB와 같은 다양한 데이터베이스에서 JSON 열에서 인덱스를 작성하여 쿼리 성능을 향상시킵니다. 특정 JSON 경로를 인덱싱하는 구문 및 이점을 설명하고 지원되는 데이터베이스 시스템을 나열합니다.

기사는 준비된 명령문, 입력 검증 및 강력한 암호 정책을 사용하여 SQL 주입 및 무차별 적 공격에 대한 MySQL 보안에 대해 논의합니다 (159 자)


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Dreamweaver Mac版
시각적 웹 개발 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

드림위버 CS6
시각적 웹 개발 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

뜨거운 주제



