Zašto C struktura može proizvesti loš SOCKS zahtjev
Provjerite eksplicitne širine polja, redoslijed bajtova i stream I/O umjesto da raspored kompajlera tretirate kao mrežni format.
Ispravna proxy adresa ne čini ručno napisanu SOCKS poruku ispravnom. Slanje C ili C++ strukture može poslati poravnanje ili cijele brojeve u redoslijedu hosta koje protokol nikada nije zahtijevao.
Za SOCKS5 CONNECT zahtjev s imenom domene, serijalizirajte ovaj slijed eksplicitno nakon pregovora o metodi i odabrane autentifikacije:
- Verzija, komanda, rezervisani bajt i tip adrese
- Dužina domene i bajtovi domene
- Dvobajtni odredišni port u mrežnom redoslijedu bajtova
Dužine adresa zavise od verzije SOCKS-a i tipa adrese. Numerička polja fiksne širine trebaju svoj propisani prikaz; tekstualni nizovi domena imaju vlastito kodiranje dužine. Terminator C niza nije opća uputa da se mrežnoj poruci doda nula.
| Prečica u implementaciji | Problem koji treba provjeriti |
|---|---|
| Dodjela 32-bitne vrijednosti kroz 8-bitni pokazivač | Ne ispisuje sva četiri bajta |
| Kastanje bafera u pokazivač na veći cijeli broj | Poravnanje i redoslijed bajtova još treba obraditi |
| Pretpostavka da je jedno čitanje ili pisanje jedna poruka | TCP može prenijeti samo dio slijeda protokola |
Uporedite svako polje s namjeravanim odredištem i obradite djelimični I/O. Primanje dva bajta ne dokazuje da je stigao cijeli odgovor. Pregled tih granica može razlikovati neispravan zahtjev od servera koji odbija ispravno opisanu vezu.