C 구조체가 잘못된 SOCKS 요청을 만들 수 있는 이유
컴파일러의 배치를 와이어 형식으로 간주하지 말고 명시적 필드 폭, 바이트 순서, 스트림 I/O를 확인하세요.
유효한 프록시 주소가 있어도 손으로 작성한 SOCKS 메시지가 유효해지지는 않습니다. C나 C++ 구조체를 보내면 프로토콜이 요구한 적 없는 패딩이나 호스트 순서의 정수가 함께 전송될 수 있습니다.
SOCKS5 도메인 이름 CONNECT 요청에서는 메서드 협상과 선택된 인증이 끝난 뒤 이 순서를 명시적으로 직렬화하세요.
- 버전, 명령, 예약 바이트, 주소 유형
- 도메인 길이와 도메인 바이트
- 네트워크 바이트 순서의 2바이트 목적지 포트
주소 길이는 SOCKS 버전과 주소 유형에 따라 달라집니다. 고정 폭 숫자 필드는 지정된 표현이 필요하고, 도메인 문자열은 자체 길이 인코딩을 가집니다. C 문자열 종료 문자는 와이어 메시지에 0을 덧붙이라는 일반 지시가 아닙니다.
| 구현 지름길 | 확인해야 할 문제 |
|---|---|
| 8비트 포인터를 통해 32비트 값 대입 | 4바이트를 모두 내보내지 않음 |
| 버퍼를 더 큰 정수 포인터로 캐스팅 | 정렬과 바이트 순서를 여전히 처리해야 함 |
| 한 번의 읽기나 쓰기가 한 메시지라고 가정 | TCP는 프로토콜 순서의 일부만 전송할 수 있음 |
각 필드를 의도한 목적지와 비교하고 부분 I/O를 처리하세요. 2바이트를 받았다고 응답 전체가 도착한 것은 아닙니다. 그 경계를 살펴보면 잘못된 요청과 올바르게 설명된 연결을 거부하는 서버를 구분할 수 있습니다.