Varför en C-struct kan ge en dålig SOCKS-begäran
Granska explicita fältbredder, byteordning och ström-I/O i stället för att behandla kompilatorns layout som trådformatet.
En giltig proxyadress gör inte ett handskrivet SOCKS-meddelande giltigt. Att skicka en C- eller C++-struct kan skicka utfyllnad eller heltal i värdordning som protokollet aldrig efterfrågade.
För en SOCKS5 CONNECT-begäran med domännamn, serialisera denna sekvens explicit efter metodförhandling och eventuell vald autentisering:
- Version, kommando, reserverad byte och adresstyp
- Domänlängd och domänbytes
- Den två byte stora målporten i nätverksbyteordning
Adresslängder beror på SOCKS-versionen och adresstypen. Numeriska fält med fast bredd behöver sin angivna representation; domänsträngar har sin egen längdkodning. En C-strängterminator är inte en allmän instruktion att lägga till en nolla i trådmeddelandet.
| Genväg i implementeringen | Problem att kontrollera |
|---|---|
| Tilldela ett 32-bitars värde via en 8-bitars pekare | Den skickar inte ut alla fyra byten |
| Casta en buffert till en pekare till ett större heltal | Justering och byteordning måste fortfarande hanteras |
| Anta att en läsning eller skrivning är ett meddelande | TCP kan bara överföra en del av protokollsekvensen |
Jämför varje fält med den avsedda destinationen och hantera partiell I/O. Att ta emot två byten bevisar inte att hela svaret har anlänt. Att granska dessa gränser kan skilja en felaktig begäran från en server som avvisar en korrekt beskriven anslutning.