Hvorfor en C-struct kan give en dårlig SOCKS-anmodning
Undersøg eksplicitte feltbredder, byte-rækkefølge og stream-I/O i stedet for at behandle compilerens layout som wire-formatet.
En gyldig proxyadresse gør ikke en håndskrevet SOCKS-besked gyldig. Hvis man sender en C- eller C++-struct, kan man sende padding eller heltal i værtsrækkefølge, som protokollen aldrig har bedt om.
Til en SOCKS5 CONNECT-anmodning med domænenavn skal denne sekvens serialiseres eksplicit efter metodeforhandling og eventuel valgt godkendelse:
- Version, kommando, reserveret byte og adressetype
- Domænelængde og domænebytes
- Den to-byte destinationsport i netværksbyte-rækkefølge
Adresselængder afhænger af SOCKS-versionen og adressetypen. Numeriske felter med fast bredde skal have deres angivne repræsentation; domænestrenge har deres egen længdekodning. En C-strengterminator er ikke en generel instruks om at tilføje et nul til wire-beskeden.
| Implementeringsgenvej | Problem at kontrollere |
|---|---|
| At tildele en 32-bit værdi gennem en 8-bit pointer | Den udsender ikke alle fire bytes |
| At caste en buffer til en pointer til et større heltal | Justering og byte-rækkefølge skal stadig håndteres |
| At antage, at én læsning eller skrivning er én besked | TCP kan kun overføre en del af protokolsekvensen |
Sammenlign hvert felt med den tilsigtede destination, og håndtér delvis I/O. At modtage to bytes beviser ikke, at hele svaret er ankommet. Ved at undersøge disse grænser kan man skelne en fejlbehæftet anmodning fra en server, der afviser en korrekt beskrevet forbindelse.